[英]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_in
中l
每一列,重復那些列值== 1
觀察,並將列名添加到df_out
的新列,在示例中為Y
。 實際上, df_in
有更多的列,並不是所有的列都在l
,這就是為什么我想在不顯式引用A
、 B
和X
列的情況下解決這個問題。
注意:此答案並未完全涵蓋這一點,因為如上所述,現實中有許多列,這些列可以是任何類型和數據,因此解決方案df_out
需要考慮所有原始列( X
在這種情況下)。 理論上, X
也可以是二進制0/1
列,但如果它包含在l
,則應該只以與A
和B
相同的方式影響結果。 我希望這有助於澄清。
對所有列使用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.