Python 选择多个列,然后替换

Python 选择多个列,然后替换,python,pandas,Python,Pandas,我正在尝试在pandas中执行多列选择然后替换 df: 选择a、b、c、d中任意或全部为非零的位置 i, j = np.where(df) s=pd.Series(dict(zip(zip(i, j), df.columns[j]))).reset_index(-1, drop=True) s: 现在我想用序列替换e列中的值: df['e'] = s.values 所以e看起来像: e: 但问题是序列的长度与数据帧中的行数不同 有什么办法吗?用于列名称为的产品,添加,最后添加,将空字符

我正在尝试在pandas中执行多列选择然后替换

df:

选择a、b、c、d中任意或全部为非零的位置

i, j = np.where(df)
s=pd.Series(dict(zip(zip(i, j), 
  df.columns[j]))).reset_index(-1, drop=True)
s:

现在我想用序列替换e列中的值:

df['e'] = s.values
所以e看起来像:

e:

但问题是序列的长度与数据帧中的行数不同

有什么办法吗?

用于列名称为的产品,添加,最后添加,将空字符串替换为

e = df.dot(df.columns + ', ').str.rstrip(', ')
df['e'] = np.where(e.astype(bool), e, None)
print (df)
   a  b  c  d     e
0  0  1  1  0  b, c
1  0  0  0  1     d
2  1  0  0  0     a
3  0  0  0  0  None

您可以定位1并将其位置用作数据框列中的布尔索引:

df['e'] = (df==1).apply(lambda x: df.columns[x], axis=1)\
                 .str.join(",").replace('','none')
#   a  b  c  d     e
#0  0  1  1  0   b,c
#1  0  0  0  1     d
#2  1  0  0  0     a
#3  0  0  0  0  none   

你的代码工作得很好。我无法得到“重复”的答案。所以从这个角度来看,这不是100%的重复
b, c 
d
a
none
e = df.dot(df.columns + ', ').str.rstrip(', ')
df['e'] = np.where(e.astype(bool), e, None)
print (df)
   a  b  c  d     e
0  0  1  1  0  b, c
1  0  0  0  1     d
2  1  0  0  0     a
3  0  0  0  0  None
df['e'] = (df==1).apply(lambda x: df.columns[x], axis=1)\
                 .str.join(",").replace('','none')
#   a  b  c  d     e
#0  0  1  1  0   b,c
#1  0  0  0  1     d
#2  1  0  0  0     a
#3  0  0  0  0  none