Python 将选定列堆叠为数据框中的行
假设我在下面的中有Python 将选定列堆叠为数据框中的行,python,pandas,dataframe,Python,Pandas,Dataframe,假设我在下面的中有df\u: 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
df\u:
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_中有更多的列,而不是所有的列都在l
中,这就是为什么我想在不明确引用列A
、B
和X
的情况下解决这个问题
注意:由于如上所述,现实中有许多列,这些列可以是任何类型和数据,因此解决方案,df_out
,需要考虑所有原始列(X
)。理论上,X
也可以是一个二进制0/1
列,但只应以与a
和B
相同的方式影响结果(如果它包含在l
中)。我希望这有助于澄清。用于所有不带l
的列,传递到、重塑、仅过滤1
并最后转换为新的DataFrame
,使用重命名
最后一列:
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
这个问题最初是问的