将多级数据框拆分为不同的 csv 文件

Split Multilevel dataframe into different csv files

假设我有以下数据框:

    X       Y
   ---+---+---+---
    A | B | A | B
--+---+---+---+---
0 | 1 | 2 | 3 | 4
1 | 5 | 6 | 7 | 8
2 | 9 | 10| 11| 12

我想根据多级索引递归拆分并保存在csv文件中。

例如,文件名 X_A.csv 应包含以下数据帧:

    X 
   ---
    A 
--+---
0 | 1 
1 | 5 
2 | 9 

同样,文件 X_B.csv 应将数据帧存储为:

    X 
   ---
    B 
--+---
0 | 2 
1 | 6 
2 | 10

依此类推 Y_A 和 Y_B。

我正在寻找一种 Pythonic(或高效)方法来执行此操作,而不是单独迭代列值,因为代码非常大。我尝试通过删除列级别并存储各个列来使用 mentioned here 技术,但我希望以这样一种方式使用它,即我不必明确提及列名,因为数据框可能会扩展(即在最顶层可能有 4 列,例如 W、X、Y 和 Z)。

选项 1

重命名 df.columns

df.columns = ['_'.join(x) for x in df.columns]

df

   X_A  X_B  Y_A  Y_B
0                    
0    1    2    3    4
1    5    6    7    8
2    9   10   11   12

for c in df:
     df[c].reset_index().to_csv(c + '.csv')

选项 2

groupby 级别

for name, g in df.groupby(level=[0, 1], axis=1):
    g.to_csv('{0}_{1}.csv'.format(*name))
list_of_df = [df[i].to_frame() for i in df.columns]

根据@JohnGalt 对 csv 的建议:

_ = [df[i].to_frame().to_csv('{0}_{1}'.format(*i)) for i in df.columns]

输出:

list_of_df[0]

   X
   A
0  1
1  5
2  9

list_of_df[1]

    X
    B
0   2
1   6
2  10

...

list_of_df[3]

    Y
    B
0   4
1   8
2  12

您可以为此使用一个简单的 apply

创建示例 df:

import pandas as pd
import numpy as np

index = pd.MultiIndex(levels=[['X', 'Y'], ['A', 'B']],labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
df = pd.DataFrame(columns=index, data=np.arange(12).reshape((3, 4)))

>>> df
Out[]:
   X      Y
   A  B   A   B
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

另存为单独的 CSV 文件:

df.apply(lambda x: x.to_csv('_'.join(x.name) + '.csv'), axis=0)

这将产生所需的输出。例如 X_A.csv 包含:

0,0
1,4
2,8

如果要将轴名称包含在 csv 中,请将 header=True 作为参数添加到 to_csv,然后 X_A.csv 将包含:

,X
,A
0,0
1,4
2,8