簡體   English   中英

在熊貓數據框中堆疊選擇列作為行

[英]Stacking select columns as rows in pandas dataframe

假設我有下面的df_in

df_in = pd.DataFrame({'X': ['a', 'b', 'c'], 'A': [1, 0, 0], 'B': [1, 1, 0]})

df_in :

+---+---+---+---+
|   | X | A | B |
+---+---+---+---+
| 0 | a | 1 | 1 |
| 1 | b | 0 | 1 |
| 2 | c | 0 | 0 |
+---+---+---+---+

我想實現以下目標:

df_out = pd.DataFrame({'X': ['a', 'a', 'b'], 'Y': ['A', 'B', 'B']})

df_out :

+---+---+---+
|   | X | Y |
+---+---+---+
| 0 | a | A |
| 1 | a | B |
| 2 | b | B |
+---+---+---+

我還有一個包含列的列表: l = list(['A', 'B']) 邏輯是,對於df_inl每一列,重復那些列值== 1觀察,並將列名添加到df_out的新列,在示例中為Y 實際上, df_in有更多的列,並不是所有的列都在l ,這就是為什么我想在不顯式引用ABX列的情況下解決這個問題。

注意:此答案並未完全涵蓋這一點,因為如上所述,現實中有許多列,這些列可以是任何類型和數據,因此解決方案df_out需要考慮所有原始列( X在這種情況下)。 理論上, X也可以是二進制0/1列,但如果它包含在l ,則應該只以與AB相同的方式影響結果。 我希望這有助於澄清。

對所有列使用Index.difference而不將l傳遞給DataFrame.set_index ,通過DataFrame.stack重塑,僅過濾1並最后將MultiIndex.to_frame轉換為新的DataFrame rename最后一列:

l = ['A', 'B']

c = df_in.columns.difference(l, sort=False).tolist()
s = df_in.set_index(c).stack()
df_out = s[s == 1].index.to_frame(index=False).rename(columns={len(c):'Y'})
print (df_out)
   X  Y
0  a  A
1  a  B
2  b  B

暫無
暫無

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

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