我使用代码获取以下数据:
import pandas as pd
df = {'ID': ['H1','H2','H3','H4','H5','H6'],
'AA1': ['C','B','B','X','G','G'],
'AA2': ['W','K','K','A','B','B'],
'name':['n1','n2','n3','n4','n5','n6']
}
df = pd.DataFrame(df)
df.groupby('AA1').apply(lambda x:x.sort_values('name'))
输出:
AA1 AA2 ID name
AA1
B 1 B K H2 n2
2 B K H3 n3
C 0 C W H1 n1
G 4 G B H5 n5
5 G B H6 n6
X 3 X A H4 n4
当我尝试to_csv
时,它将丢失第一个索引AA1
,我希望我可以像groupby
结果一样输出csv,但不会输出如下结果:
AA1 AA2 ID name
1 B K H2 n2
2 B K H3 n3
0 C W H1 n1
4 G B H5 n5
5 G B H6 n6
3 X A H4 n4
我的意思是,当我在excel
中打开csv文件时,我希望能看到jupyter中输出的格式!
答案 0 :(得分:4)
CSV格式有其局限性。其中一个是保存有关多索引的信息。您必须跟踪并明智地加载数据。这是一个例子。
df
AA1 AA2 ID name
AA1
B 1 B K H2 n2
2 B K H3 n3
C 0 C W H1 n1
G 4 G B H5 n5
5 G B H6 n6
X 3 X A H4 n4
df.to_csv('test.csv')
!cat test.csv
AA1,,AA1,AA2,ID,name
B,1,B,K,H2,n2
B,2,B,K,H3,n3
C,0,C,W,H1,n1
G,4,G,B,H5,n5
G,5,G,B,H6,n6
X,3,X,A,H4,n4
这就是CSV的保存方式。现在,当加载它时,指定index_col
并且将像以前一样加载多索引。
(pd.read_csv('test.csv', index_col=[0, 1])
.rename_axis(['AA1', None])
.rename(columns=lambda x: x.split('.')[0]))
AA1 AA2 ID name
AA1
B 1 B K H2 n2
2 B K H3 n3
C 0 C W H1 n1
G 4 G B H5 n5
5 G B H6 n6
X 3 X A H4 n4
请记住,保存和重新加载时列名会被破坏 - 这是另一个CSV限制。
正如其他答案所提到的那样,最好在调用index_label
时使用to_csv
明确保存,这样您就不必解开列。
答案 1 :(得分:2)
可能你可以试试这个:
df_result.to_excel("result.xlsx")
索引名称" AA1"将留下。
答案 2 :(得分:2)
如果想要与之前相同的输出 - MultiIndex DataFrame,需要从第一列和第二列创建index_col
的参数MultiIndex
:
df = pd.read_cav(file, index_col=[0,1])
最好在to_csv
参数index_label
中指定,以避免重复索引和列名称 - 这里AA1
:
df.to_csv('a.csv', index_label=['a','b'])
a,b,AA1,AA2,ID,name
B,1,B,K,H2,n2
B,2,B,K,H3,n3
C,0,C,W,H1,n1
G,4,G,B,H5,n5
G,5,G,B,H6,n6
X,3,X,A,H4,n4
df = pd.read_csv('a.csv', index_col=[0,1])
print (df)
AA1 AA2 ID name
a b
B 1 B K H2 n2
2 B K H3 n3
C 0 C W H1 n1
G 4 G B H5 n5
5 G B H6 n6
X 3 X A H4 n4
因为默认情况下,对于没有名称的所有列都会获取Unnamed
,并且对于所有重复项,会添加.1
,.2
以避免重复:
df.to_csv('a.csv')
AA1,,AA1,AA2,ID,name
B,1,B,K,H2,n2
B,2,B,K,H3,n3
C,0,C,W,H1,n1
G,4,G,B,H5,n5
G,5,G,B,H6,n6
X,3,X,A,H4,n4
#create DataFrame without MultiIndex
df = pd.read_csv('a.csv')
print (df)
AA1 Unnamed: 1 AA1.1 AA2 ID name
0 B 1 B K H2 n2
1 B 2 B K H3 n3
2 C 0 C W H1 n1
3 G 4 G B H5 n5
4 G 5 G B H6 n6
5 X 3 X A H4 n4
#create DataFrame with Multiindex
df = pd.read_csv('a.csv', index_col=[0,1])
print (df)
AA1.1 AA2 ID name
AA1 Unnamed: 1
B 1 B K H2 n2
2 B K H3 n3
C 0 C W H1 n1
G 4 G B H5 n5
5 G B H6 n6
X 3 X A H4 n4
答案 3 :(得分:2)
顺便说一句,您不需要.groupby
与.sort_values
一起使用; df.sort_values(['AA1','name'])
基本上做同样的事情。所以我建议以下内容,它不能完全回答你的问题,但可能是一个更好的选择:
df.sort_values(['AA1','name']).to_csv('test.csv', index = False)
index = False
这里告诉pandas不要将索引写入csv(从0到5的数字,从排序中重新排序)。无论如何,如果你想要这样做,请不要将index = False
传递给.to_csv()
。