如何展平python / pandas数据透视表并操纵列名?

时间:2016-04-20 18:41:03

标签: python pandas pivot-table

我希望展开此数据透视表,但我无法找到一种方法来删除/隐藏/删除" ID"的多索引行。

相关守则:

df = df [['B1','B2','B3','B4']]
df = pd.pivot_table(df,values=['BUCKET'],index=['ID'],columns=['TYPE'],aggfunc=len,fill_value='',margins=True)

哪个收益率:

      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

以下一行通过删除第一行

让我更近了一步
df.columns = df.columns.droplevel(0)

哪个收益率:

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

我需要进一步展平数据透视表并删除" TYPE"行标题,用" ID"替换它,并隐藏/删除前一个" ID"排,所以它看起来像这样清洁整洁:

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

我试过用这些来操纵列/行,但无济于事......建议?谢谢!

pd.melt(df,id_vars=['ID'])
results.columns = results.columns.get_level_values(1)
pivot_table.values.reset_index().values.tolist()

3 个答案:

答案 0 :(得分:3)

您可以在pandas 0.18.0 - rename_axis中使用新功能删除列名,然后使用reset_index

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

print df.rename_axis(None, axis=1)
     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

print df.rename_axis(None, axis=1).reset_index()
   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

答案 1 :(得分:1)

这是您的列的索引名称,您只需为其分配None

df.columns.name = None

应该工作

答案 2 :(得分:0)

仅供参考:我是一个新手,在python3.7中,似乎通过删除第一列即可完成工作。 (不知道保存到csv后为什么会更改)。

A)删除第一列之前:

df = df[df['date'] <= 20181221]
df['YYYYMM'] = a ['date'].astype(str).slice(0, 6)
pivot_table = pd.pivot_table(df, index=['product_name'], columns=['YYYYMM'], values=['income'], aggfunc=np.sum)
pivot_table.to_csv('xx.csv')

打开xx.csv,获取以下内容: enter image description here

B)删除第一列:

pivot_table.columns = pivot_table.columns.droplevel(0)
pivot_table.to_csv('xxx.csv')

打开xxx.csv,获取以下内容: enter image description here