我不确定这些数据是否已经正确地被呈现为广义格式(wide format),但我的目的是实现以下内容:
将数据从d1
的形状转换成d2
的形状。
In [26]: d1 = pd.DataFrame({'where':['x','y'],
...: 'p1':[3,7],
...: 'p2':[11,12]})
In [27]: d2=pd.DataFrame({
...: 'where':['x','x','y','y'],
...: 'who':['p1','p2','p1','p2'],
...: 'value':[3,11,7,12]})
这看起来是:
In [10]: d1
Out[10]:
where p1 p2
0 x 3 11
1 y 7 12
In [11]: d2
Out[11]:
where who value
0 x p1 3
1 x p2 11
2 y p1 7
3 y p2 12
我认为这是 d1.pivot( ... )
的某种形式,但我似乎无法弄清楚如何去处理。
因此,明确一下,我想使用 pandas 将数据 d1
重新塑造成 d2
的结构。
编辑
以下方法可行,但是方法比较差。
d3 = d1.pivot(columns='where').T.reset_index()
d3.columns = ['who','where','a','b']
d3 = d3.loc[:,['where','who','a','b']]
d3 = d3.sort_values('where')
d3.fillna(value=0,inplace=True)
d3['c'] = d3.a + d3.b
d3.drop(['a','b'],axis=1,inplace=True)
d3.columns=['where','who','value']
In [43]: d3
Out[43]:
where who value
0 x p1 3.0
2 x p2 11.0
1 y p1 7.0
3 y p2 12.0
编辑2
以下内容可行
In [49]: d1.melt(id_vars='where')
Out[49]:
where variable value
0 x p1 3
1 y p1 7
2 x p2 11
3 y p2 12
我想知道使用透视表是否可以实现这个操作?我原本以为所有这些操作都可以使用透视表函数来完成。
编辑3 - 获取原始结构的示例
上面我提到的是使用 pivot
函数,而不是使用 pivot_table
函数,不过以下示例是根据最终结果找回原始结构的一种方法。
d1.melt(id_vars='where').pivot_table(values="value", index="where", columns="variable")
variable p1 p2
where
x 3 11
y 7 12