如何使用 df.to_csv 为多索引数据帧 python3 格式化 csv 文件
How to format the csv file with df.to_csv for a multiindex dataframe, python3
我有一个 multi-indexed 数据框,
>>> df
a1 a2
b1 b2 b1 b2
c1 d1 11 21 31 41
d2 12 22 32 42
c2 d1 13 23 33 43
d2 14 24 34 44
它有2级header和2级索引。如果我直接使用代码df.to_csv('test_file.csv')
,那么文件test_file.csv
的格式就是
,,a1,a1,a2,a2
,,b1,b2,b1,b2
c1,d1,11,21,31,41
c1,d2,12,22,32,42
c2,d1,13,23,33,43
c2,d2,14,24,34,44
不过我想改成
- 删除 header
第一级中的重复项
- 删除整个第一级索引,并为第一级索引中的每个索引创建一个空行。
想要的格式是:
,a1,,a2,
,b1,b2,b1,b2
c1,,,,,
d1,11,21,31,41
d2,12,22,32,42
c2,,,,,
d1,13,23,33,43
d2,14,24,34,44
你能告诉我怎么做吗?谢谢!
请使用下面的代码。
import pandas as pd
df = pd.DataFrame(
{
('a1', 'b1'): [11, 12, 13, 14],
('a1', 'b2'): [21, 22, 23, 24],
('a2', 'b1'): [31, 32, 33, 34],
('a2', 'b2'): [41, 42, 43, 44],
},
index=pd.MultiIndex.from_tuples([
('c1', 'd1'),
('c1', 'd2'),
('c2', 'd1'),
('c2', 'd2'),
]),
)
print(df)
df.to_csv('my_test_file.csv')
这是一个可行的解决方案。它使用辅助函数删除重复的连续标签,并使用 groupy
+apply
+pandas.concat
将多索引级别移动为额外的空行:
def remove_consecutive(l):
'''replaces consecutive items in "l" with empty string'''
from itertools import groupby, chain
return tuple(chain(*([k]+['']*(len(list(g))-1) for k,g in groupby(l))))
(df.groupby(level=0)
# below to shift level=0 as new row
.apply(lambda g: pd.concat([pd.DataFrame([],
index=[g.name],
columns=g.columns),
g.droplevel(0)]))
.droplevel(0)
# below to remove the duplicate column names
.T # unfortunately there is no set_index equivalent for columns, so transpose before/after
.set_index(pd.MultiIndex.from_arrays(list(map(remove_consecutive, zip(*df.columns)))))
.T
# export
.to_csv('filename.csv')
)
输出:
,a1,,a2,
,b1,b2,b1,b2
c1,,,,
d1,11,21,31,41
d2,12,22,32,42
c1,,,,
d1,13,23,33,43
d2,14,24,34,44
我有一个 multi-indexed 数据框,
>>> df
a1 a2
b1 b2 b1 b2
c1 d1 11 21 31 41
d2 12 22 32 42
c2 d1 13 23 33 43
d2 14 24 34 44
它有2级header和2级索引。如果我直接使用代码df.to_csv('test_file.csv')
,那么文件test_file.csv
的格式就是
,,a1,a1,a2,a2
,,b1,b2,b1,b2
c1,d1,11,21,31,41
c1,d2,12,22,32,42
c2,d1,13,23,33,43
c2,d2,14,24,34,44
不过我想改成
- 删除 header 第一级中的重复项
- 删除整个第一级索引,并为第一级索引中的每个索引创建一个空行。
想要的格式是:
,a1,,a2,
,b1,b2,b1,b2
c1,,,,,
d1,11,21,31,41
d2,12,22,32,42
c2,,,,,
d1,13,23,33,43
d2,14,24,34,44
你能告诉我怎么做吗?谢谢! 请使用下面的代码。
import pandas as pd
df = pd.DataFrame(
{
('a1', 'b1'): [11, 12, 13, 14],
('a1', 'b2'): [21, 22, 23, 24],
('a2', 'b1'): [31, 32, 33, 34],
('a2', 'b2'): [41, 42, 43, 44],
},
index=pd.MultiIndex.from_tuples([
('c1', 'd1'),
('c1', 'd2'),
('c2', 'd1'),
('c2', 'd2'),
]),
)
print(df)
df.to_csv('my_test_file.csv')
这是一个可行的解决方案。它使用辅助函数删除重复的连续标签,并使用 groupy
+apply
+pandas.concat
将多索引级别移动为额外的空行:
def remove_consecutive(l):
'''replaces consecutive items in "l" with empty string'''
from itertools import groupby, chain
return tuple(chain(*([k]+['']*(len(list(g))-1) for k,g in groupby(l))))
(df.groupby(level=0)
# below to shift level=0 as new row
.apply(lambda g: pd.concat([pd.DataFrame([],
index=[g.name],
columns=g.columns),
g.droplevel(0)]))
.droplevel(0)
# below to remove the duplicate column names
.T # unfortunately there is no set_index equivalent for columns, so transpose before/after
.set_index(pd.MultiIndex.from_arrays(list(map(remove_consecutive, zip(*df.columns)))))
.T
# export
.to_csv('filename.csv')
)
输出:
,a1,,a2,
,b1,b2,b1,b2
c1,,,,
d1,11,21,31,41
d2,12,22,32,42
c1,,,,
d1,13,23,33,43
d2,14,24,34,44