提供给我的输入是几个文本,读取为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