簡體   English   中英

Pandas 中的數據透視表以“整理”數據框

[英]Pivot table to "tidy" data frame in Pandas

我有一組數字(我認為該格式使其成為數據透視表),我想將其轉換為“整潔”的數據框。 例如,我從左側的變量 1、頂部的變量 2 和中間的感興趣值開始,如下所示:

  X Y
A 1 2
B 3 4

我想把它變成這樣一個整潔的數據框:

V1 V2 value
A  X    1
A  Y    2
B  X    3
B  Y    4

行和列順序對我來說無關緊要,所以以下是完全可以接受的:

value V1 V2
  2    A  Y
  4    B  Y
  3    B  X
  1    A  X

對於我的第一次嘗試,它能夠讓我得到正確的最終答案,我遍歷了行和列。 這非常慢,我懷疑 Pandas 中的某些機器會使它運行得更快。

似乎melt接近我尋求的魔法,但它並沒有讓我一路走到那里。 第一個數組變成了這個:

   V2 value
0  X    1
1  X    2
2  Y    3
3  Y    4

它擺脫了我的 V1 變量!

沒有什么特別的melt ,所以我會很樂意閱讀使用其他方法,特別是如果答案melt並不比我的嵌套的循環更快,另一種解決方案是。 盡管如此,我怎樣才能從那個數組轉到我想要作為輸出的那種整潔的數據框?

示例數據框:

df = pd.DataFrame({"X":[1,3], "Y":[2,4]},index=["A","B"])

使用DataFrame.reset_indexDataFrame.rename_axis然后DataFrame.melt 如果您想要訂購列,我們可以使用DataFrame.reindex

new_df = (df.rename_axis(index = 'V1')
            .reset_index()
            .melt('V1',var_name='V2')
            .reindex(columns = ['value','V1','V2']))
print(new_df)

另一種方法DataFrame.stack

new_df = (df.stack()
            .rename_axis(index = ['V1','V2'])
            .rename('value')
            .reset_index()
            .reindex(columns = ['value','V1','V2']))
print(new_df)

   value V1 V2
0      1  A  X
1      3  B  X
2      2  A  Y
3      4  B  Y

要命名名稱,還有另一種選擇,例如在評論中評論@Scott Boston

Melt 是一個很好的方法,但它似乎不能很好地通過索引識別結果。 您可以先重置索引以將其移動到其自己的列,然后將該列用作 id col。

test = pd.DataFrame([[1,2],[3,4]], columns=['X', 'Y'], index=['A', 'B'])
   X  Y
A  1  2
B  3  4

test = test.reset_index()
  index  X  Y
0     A  1  2
1     B  3  4

test.melt('index',['X', 'Y'], 'prev cols')  
  index prev cols  value
0     A         X      1
1     B         X      3
2     A         Y      2
3     B         Y      4

暫無
暫無

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

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