簡體   English   中英

從寬到長透視熊貓數據框

[英]Pivot pandas dataframe from from wide to long

我不確定這些數據是否采用寬格式,但我想做的是以下內容:

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

我很好奇這是否可以通過樞軸實現? 我的印象是所有這些操作都可以使用 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

不,它不能用數據透視表完成。 您不是在數據框中旋轉值。

您將使用 pivot 將 d2 返回到 d1。 例如,下面的示例顯示 d1 變為 d2(按照最初的要求),然后我們可以使用 pivot_table 將 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

您要做的是將數據從寬數據集“反透視”為長數據集

頂級melt() 函數和相應的DataFrame.melt() 可用於將DataFrame 轉換為一種格式,其中一列或多列是標識符變量,而所有其他列(被視為測量變量)“未透視”到行軸,只留下兩個非標識符列,“變量”和“值”。 可以通過提供 var_name 和 value_name 參數來自定義這些列的名稱。

這應該可以解決問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM