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

时间:2017-09-11 19:32:07

标签: python pandas dataframe multi-index

假设我有以下数据框:

    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)。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

选项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))

答案 2 :(得分:2)

您可以使用简单的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