如何解压用字典创建的 pandas 面板?
How to unpack a pandas Panel created with a dictionary?
我在子目录中有几个 .txt
文件,/subdirect/
这些文件是
file1.txt
file2.txt
file3.txt
file4.txt
...
使用 glob,我可以将它们放入三维面板中,使用文件名作为键值对的键。
import glob
import pandas as pd
dataframe = {filename: pd.read_csv(filename) for filename in glob.glob('*.txt') # dictionary
data = pd.Panel.from_dict(dataframe) # create panel
现在,我想解压缩这些文件以单独操作每个 DataFrame 并绘制数据。
for fname in data:
df = pd.read_csv(fname)
df['total_sum'] = df[["column1", "column2", "column3"]].sum(axis=1) # sum total reads
df.plot(kind='bar')
但是,我似乎没有正确打开面板的包装,因为尺寸已经完全改变了。
如何打开 pandas 面板的包装?
单独读取数据文件如何,因为您似乎对 Panel
结构本身不感兴趣:
import glob
import pandas as pd
for filename in glob.glob('*.txt'):
df = pd.read_csv(filename)
df['total_sum'] = df[["column1", "column2", "column3"]].sum(axis=1) # sum total reads
df.plot(kind='bar')
或者,查看 pd.Panel.to_frame()
将 Panel
转换为 DataFrame
。例如,Panel
来自 dict
和两个 DataFrames
:
df = pd.DataFrame(np.random.random(size=(20, 10)))
panel = pd.Panel.from_dict({'1': df, '2': df.add(10)})
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 20 (major_axis) x 10 (minor_axis)
Items axis: 1 to 2
Major_axis axis: 0 to 19
Minor_axis axis: 0 to 9
使用 to_frame()
可以得到一个包含两列的长格式 DataFrame
和一个长度为 row
x column
的 MultiIndex
。要绘图,您可以使用 .items()
遍历 data_frame
的 columns
并使用 .unstack()
转换为适合绘图的格式:
data_frame = panel.to_frame()
MultiIndex: 200 entries, (0, 0) to (19, 9)
Data columns (total 2 columns):
1 200 non-null float64
2 200 non-null float64
dtypes: float64(2)
memory usage: 4.7+ KB
None
for i, data in data_frame.items():
data.unstack().plot()
关于性能 - 如果您从一个面板开始,求和比分组和取消堆叠更快。它也比对单个数据帧求和更快。
%timeit panel.sum(axis=1)
10000 loops, best of 3: 111 µs per loop
%timeit panel.to_frame().groupby(data_frame.columns, axis=1).apply(lambda x: x.unstack(0).sum(axis=1))
100 loops, best of 3: 3.63 ms per loop
df = data_frame.unstack(0)
%timeit df.loc[:, '1'].sum(axis=1)
1000 loops, best of 3: 409 µs per loop
我会将文件解压缩为平面文件并将文件名添加为一列。您现在可以使用文件名和数据框中的任何属性创建一个 MultiIndex。
在改进 MultiIndex 功能之前使用了面板。扁平比嵌套好。
import glob
import pandas as pd
dfs = []
for filename in glob.glob('*.txt'):
df = pd.read_csv(filename)
df['filename'] = filename
dfs.append(df)
dfs = pd.concat(dfs, ignore_index=True)
我在子目录中有几个 .txt
文件,/subdirect/
这些文件是
file1.txt
file2.txt
file3.txt
file4.txt
...
使用 glob,我可以将它们放入三维面板中,使用文件名作为键值对的键。
import glob
import pandas as pd
dataframe = {filename: pd.read_csv(filename) for filename in glob.glob('*.txt') # dictionary
data = pd.Panel.from_dict(dataframe) # create panel
现在,我想解压缩这些文件以单独操作每个 DataFrame 并绘制数据。
for fname in data:
df = pd.read_csv(fname)
df['total_sum'] = df[["column1", "column2", "column3"]].sum(axis=1) # sum total reads
df.plot(kind='bar')
但是,我似乎没有正确打开面板的包装,因为尺寸已经完全改变了。
如何打开 pandas 面板的包装?
单独读取数据文件如何,因为您似乎对 Panel
结构本身不感兴趣:
import glob
import pandas as pd
for filename in glob.glob('*.txt'):
df = pd.read_csv(filename)
df['total_sum'] = df[["column1", "column2", "column3"]].sum(axis=1) # sum total reads
df.plot(kind='bar')
或者,查看 pd.Panel.to_frame()
将 Panel
转换为 DataFrame
。例如,Panel
来自 dict
和两个 DataFrames
:
df = pd.DataFrame(np.random.random(size=(20, 10)))
panel = pd.Panel.from_dict({'1': df, '2': df.add(10)})
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 20 (major_axis) x 10 (minor_axis)
Items axis: 1 to 2
Major_axis axis: 0 to 19
Minor_axis axis: 0 to 9
使用 to_frame()
可以得到一个包含两列的长格式 DataFrame
和一个长度为 row
x column
的 MultiIndex
。要绘图,您可以使用 .items()
遍历 data_frame
的 columns
并使用 .unstack()
转换为适合绘图的格式:
data_frame = panel.to_frame()
MultiIndex: 200 entries, (0, 0) to (19, 9)
Data columns (total 2 columns):
1 200 non-null float64
2 200 non-null float64
dtypes: float64(2)
memory usage: 4.7+ KB
None
for i, data in data_frame.items():
data.unstack().plot()
关于性能 - 如果您从一个面板开始,求和比分组和取消堆叠更快。它也比对单个数据帧求和更快。
%timeit panel.sum(axis=1)
10000 loops, best of 3: 111 µs per loop
%timeit panel.to_frame().groupby(data_frame.columns, axis=1).apply(lambda x: x.unstack(0).sum(axis=1))
100 loops, best of 3: 3.63 ms per loop
df = data_frame.unstack(0)
%timeit df.loc[:, '1'].sum(axis=1)
1000 loops, best of 3: 409 µs per loop
我会将文件解压缩为平面文件并将文件名添加为一列。您现在可以使用文件名和数据框中的任何属性创建一个 MultiIndex。
在改进 MultiIndex 功能之前使用了面板。扁平比嵌套好。
import glob
import pandas as pd
dfs = []
for filename in glob.glob('*.txt'):
df = pd.read_csv(filename)
df['filename'] = filename
dfs.append(df)
dfs = pd.concat(dfs, ignore_index=True)