如何解压用字典创建的 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 columnMultiIndex。要绘图,您可以使用 .items() 遍历 data_framecolumns 并使用 .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)