将多级数据框拆分为不同的 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
假设我有以下数据框:
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