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

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

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

"""一般情况下,透视表如下:"""
df = df [['B1','B2','B3','B4']]
df = pd.pivot_table(df,
                    values=['BUCKET'],
                    index=['ID'],
                    columns=['TYPE'],
                    aggfunc=len)   # 代码中values, index, columns全是列表形式。
# 运行结果如下:
      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

解决方法:

一:使用 pandas- rename_axis。先去除透视表的行名称,再重置透视表的index

df.columns = df.columns.droplevel(0)  # 即把第一层的column即value字段的名称删除:此处是“BUCKET”
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
# None 即column表头的称谓更新为空。axis=1 处理对象是所有column表头的称谓,此处“TYPE”。
# DataFrame.rename_axis: Set the name of the axis for the index or columns.


print(df1)
     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() 
# .reset_index 即撤销原来的index(“ID”由index变为普通的列),index重新由pandas默认值取代(即0, 1, ..., n)。
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.columns.rename_axis(None, axis=1).reset_index(inplace=True) ,则不会保留原index,即'ID’被删除,由pands默认值取代。

二:直接保存为csv格式,然后读取。

df.columns = df.columns.droplevel(0)
df.to_csv('文件路径+文件名.csv') 
# 如果是中文: df.to_csv('文件路径+文件名.csv', encoding='gbk') 

打开 ‘文件路径+文件名.csv’ 后,结果是

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

PS:在df_new的基础上,把index重置为ID

df_new.set_index('ID', inplace=True)
print(df_new)

不能得到:

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

得到的而是:

     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

你可能感兴趣的:(数据可视化)