从大到长的数据透视熊猫数据框

时间:2020-01-30 15:09:22

标签: python pandas dataframe

我不确定此数据是否正确以宽格式显示,但是我想要做的是以下操作:

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( ... )的某种形式,但是我似乎无法弄清楚如何去做。

因此,很明显,我希望能够使用熊猫将数据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

2 个答案:

答案 0 :(得分:1)

否,数据透视表无法完成。您不会在数据框中枢转值。

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

d1.melt(id_vars='where')

  where variable  value
0     x       p1      3
1     y       p1      7
2     x       p2     11
3     y       p2     12


d1.melt(id_vars='where').pivot(values="value", index="where", columns="variable")

variable    p1  p2
where       
x           3   11
y           7   12

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

The top-level melt() function and the corresponding DataFrame.melt() are useful to massage a DataFrame into a format where one or more columns are identifier variables, while all other columns, considered measured variables, are “unpivoted” to the row axis, leaving just two non-identifier columns, “variable” and “value”. The names of those columns can be customized by supplying the var_name and value_name parameters.

答案 1 :(得分:0)

这应该可以解决问题:

d1.set_index('where').unstack().reset_index().rename(columns={"level_0": "who", 0: "value"})

输出:

  who where  value
0  p1     x      3
1  p1     y      7
2  p2     x     11
3  p2     y     12