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
这个问题最初是问的