Pandas:多维透视表 - 如何重复项目标签 同时 不显示columns字段名称

来源:How do I flatten a python/pandas pivot table and manipulate the column names?链接这里

问题:把一般情况下得到的透视表,变成想要的格式:

"""一般情况下,透视表如下:"""
df = pd.pivot_table(DataFrame,
                    values=['BUCKET'],
                    index=['ID'],
                    columns=['TYPE'],
                    aggfunc=len)  
print(df)
# 运行结果如下:
      BUCKET
TYPE  B1     B2       B3      B4
ID
1     236    data1    data2   data3   
2     323    data4    data5   data3
3     442    data6    data2   data4
4     543    data8    data2   data3
5     676    data1    data8   data4

""" 
问题是,我想要如下所示的格式:

ID    B1     B2       B3      B4
1     236    data1    data2   data3   
2     323    data4    data5   data3
3     442    data6    data2   data4
4     543    data8    data2   data3
5     676    data1    data8   data4
"""

第一种解决方法:

先去除透视表的行名称,最后重置透视表的index

df.columns = df.columns.droplevel(0) 
print(df)
# 结果如下
TYPE  B1     B2       B3      B4
ID
1     236    data1    data2   data3   
2     323    data4    data5   data3
3     442    data6    data2   data4
4     543    data8    data2   data3
5     676    data1    data8   data4
df_1 = df.rename_axis([None], axis=1)    # columns有N个,就用N个None
print(df_1)  # 本初的“TYPE”被重置为空;但是 ID 和 B1,B2,B3,B4不在一行
# 结果如下
     B1     B2     B3     B4
ID                          
1   236  data1  data2  data3
2   323  data4  data5  data3
3   442  data6  data2  data4
4   543  data8  data2  data3
5   676  data1  data8  data4
df_2 = df.rename_axis(None, axis=1).reset_index() 
print(df_2)
# 结果如下
   ID   B1     B2     B3     B4
0   1  236  data1  data2  data3
1   2  323  data4  data5  data3
2   3  442  data6  data2  data4
3   4  543  data8  data2  data3
4   5  676  data1  data8  data4
#注:如果改为df_2 = df.rename_axis(None, axis=1).reset_index(drop=True) ,则由pandas默认值取代原来的index,即'ID’被删除。
第二种解决方法:直接保存为csv格式,然后读取。
df.columns = df.columns.droplevel(0)
df.to_csv('文件路径+文件名.csv', encoding='utf-8-sig', index=False) 

打开储存的文件可以看到:

ID B1 B2 B3 B4
1 236 data1 data2 data3
2 323 data4 data5 data3
3 442 data6 data2 data4
4 543 data8 data2 data3
5 676 data1 data8 data4

pandas读取 ‘文件路径+文件名.csv’ 后,结果是

df_new = pd.read_csv('文件路径+文件名.csv')
print(df_new)
   ID   B1     B2     B3     B4
0   1  236  data1  data2  data3
1   2  323  data4  data5  data3
2   3  442  data6  data2  data4
3   4  543  data8  data2  data3
4   5  676  data1  data8  data4


附注:在df_new的基础上,用pandas.DataFrame.set_indexID作为index列,不能得到:

ID    B1     B2       B3      B4
1     236    data1    data2   data3   
2     323    data4    data5   data3
3     442    data6    data2   data4
4     543    data8    data2   data3
5     676    data1    data8   data4

得到的而是:

df_new.set_index('ID', inplace=True)
print(df_new)
# 结果如下
     B1     B2     B3     B4
ID                          
1   236  data1  data2  data3
2   323  data4  data5  data3
3   442  data6  data2  data4
4   543  data8  data2  data3
5   676  data1  data8  data4
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章