python——pandas的pivot_table使用

提供给我的输入是几个文本,读取为dataframe格式之后如下(此处只列出两个文本的模拟内容)

In[179]: t1
Out[178]: 
   id  value1  value2
0   1     100      98
1   2      98      87
2   3      97      93
3   4      96      96
4   5      99      80
In[181]: t2
Out[180]: 
   id  value1  value2
0   1      96     100
1   2      98      98
2   3     100      97
3   4      86      89
4   5      89      87
但其实最后要的dataframe格式是这样的:

In[201]: t
Out[200]: 
   id    type  t1         t2
0   1  value1     100      96
1   1  value2      98     100
2   2  value1      98      98
3   2  value2      87      98
4   3  value1      97     100
5   3  value2      93      97
6   4  value1      96      86
7   4  value2      96      89
8   5  value1      99      89
9   5  value2      80      87

利用pandas的pivot_table可以实现。

In[239]: t1 = pd.DataFrame({'id':[1,2,3,4,5],'value1':[100,98,97,96,99],'value2':[98,87,93,96,80]})
In[240]: t1 = pd.pivot_table(t1,index='id').stack().reset_index()
In[241]: t1
Out[240]: 
   id level_1    0
0   1  value1  100
1   1  value2   98
2   2  value1   98
3   2  value2   87
4   3  value1   97
5   3  value2   93
6   4  value1   96
7   4  value2   96
8   5  value1   99
9   5  value2   80
将t2也做相同处理,使用pandas的rename(t1.rename(columns={'level_1':'type',0:'value1'}))方法将列名相应更新之后,按id和type进行merge,即可获得想要的dataframe。

还有一种写法(感谢胡哥)也可以获得相同效果,甚至更为简洁:

In[242]: t1 = pd.DataFrame({'id':[1,2,3,4,5],'value1':[100,98,97,96,99],'value2':[98,87,93,96,80]})
In[243]: t1 = t1.set_index('id').stack().reset_index()
In[244]: t1
Out[243]: 
   id level_1    0
0   1  value1  100
1   1  value2   98
2   2  value1   98
3   2  value2   87
4   3  value1   97
5   3  value2   93
6   4  value1   96
7   4  value2   96
8   5  value1   99
9   5  value2   80






你可能感兴趣的:(python)