将 pandas 数据框从宽转为长

bax*_*axx 6 python dataframe pandas

我不确定这些数据是否正确采用宽格式,但我想做的是以下内容:

从 形状 转换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]})
Run Code Online (Sandbox Code Playgroud)

看起来像:

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

Run Code Online (Sandbox Code Playgroud)

我认为这是某种形式d1.pivot( ... ),但我似乎不知道如何去做。

因此,需要明确的是,我希望能够将数据重塑d1为使用 pandas 的结构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
Run Code Online (Sandbox Code Playgroud)

编辑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
Run Code Online (Sandbox Code Playgroud)

我很好奇枢轴是否可以实现这一点?我的印象是所有这些操作都可以使用pivot函数来完成

编辑 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
Run Code Online (Sandbox Code Playgroud)

sdh*_*aus 3

不,这不能用数据透视表来完成。您没有在数据框中旋转值。

\n\n

您可以使用pivot 将 d2 返回到 d1。例如,下面显示 d1 变成 d2(按照最初的要求),然后我们可以使用pivot_table 将 d2 返回到 d1。

\n\n
d1.melt(id_vars=\'where\')\n\n  where variable  value\n0     x       p1      3\n1     y       p1      7\n2     x       p2     11\n3     y       p2     12\n\n\nd1.melt(id_vars=\'where\').pivot(values="value", index="where", columns="variable")\n\nvariable    p1  p2\nwhere       \nx           3   11\ny           7   12\n
Run Code Online (Sandbox Code Playgroud)\n\n

您想要做的是将数据从宽数据集“逆透视”到长数据集

\n\n

顶层的melt()函数和相应的DataFrame.melt()对于将DataFrame转换为一种格式很有用,其中一列或多列是标识符变量,而所有其他列(被视为测量变量)是\xe2\x80\x9cunpivoted \xe2\x80\x9d 到行轴,只留下两个非标识符列,\xe2\x80\x9cvariable\xe2\x80\x9d 和 \xe2\x80\x9cvalue\xe2\x80\x9d。可以通过提供 var_name 和 value_name 参数来自定义这些列的名称。

\n