来源: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