假设我有以下数据框:
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)。
答案 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
。
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
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