2017-10-15 82 views
2

我有这样布尔值的列名在一个列表,数据帧大熊猫蟒蛇

 A B C D E 
    0 0.0 1.0 0.0 0.0 1.0 
    1 0.0 0.0 1.0 0.0 0.0 
    2 0.0 1.0 1.0 1.0 0.0 
    3 1.0 0.0 0.0 0.0 1.0 
    4 0.0 0.0 0.0 1.0 0.0 

使命一个数据帧是让这样的

0 B,E 
1 C 
2 B,C,D 
3 A,E 
4 D 

任何想法的列表,在此先感谢。

+0

答案是向下:) – amn89

+1

伟大的工作agaim,@jezrael – pyd

+0

重复的https://stackoverflow.com/questions/32125954/pandas-map-0-1-data-frame-entries-to-column-names和https://stackoverflow.com/questions/38169342/python-pandas -dataframe-return-column-name – Zero

回答

3

可以通过行使用applyaxis=1进行处理,然后比较各行与1为索引值(因为axis=1每一行被转换成系列与来自列索引),其通过,接合:

s1 = df.apply(lambda x: ','.join(x.index[x == 1]), axis=1) 
print (s1) 
0  B,E 
1  C 
2 B,C,D 
3  A,E 
4  D 
dtype: object 

另一种解决方案,如果更大,则速度更快DataFrame。列

首先改变格式列出:

print (['{}, '.format(x) for x in df.columns]) 
['A, ', 'B, ', 'C, ', 'D, ', 'E, '] 

同样喜欢:

s = np.where(df == 1, ['{}, '.format(x) for x in df.columns], '') 

因为1值被强制转换为True秒。比较DataFrame值和列名的True的使用自定义格式:

s = np.where(df, ['{}, '.format(x) for x in df.columns], '') 
print (s) 
[['' 'B, ' '' '' 'E, '] 
['' '' 'C, ' '' ''] 
['' 'B, ' 'C, ' 'D, ' ''] 
['A, ' '' '' '' 'E, '] 
['' '' '' 'D, ' '']] 

最后一个加入的所有行与删除空值:

s1 = pd.Series([''.join(x).strip(', ') for x in s], index=df.index) 
print (s1) 
0  B, E 
1   C 
2 B, C, D 
3  A, E 
4   D 
dtype: object 
+0

太棒了回答!,非常感谢:) – amn89