如何输出groupby对象的csv?

时间:2017-11-01 05:39:41

标签: python pandas csv

我使用代码获取以下数据:

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中输出的格式!

4 个答案:

答案 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()