我有一个数据框,df:
id_0 id_1 id_2
0 1 0 1
1 1 0 0
2 0 1 0
3 1 1 0
4 0 0 1
5 0 0 0
我想获取每行的列名称,如果有1.如何做到这一点?谢谢。
结果:
result
0 id_0, id_2
1 id_0
2 id_1
3 id_0, id_1
4 id_2
5 NaN
答案 0 :(得分:6)
使用dot
df.dot(df.columns+',').str[:-1]
Out[168]:
0 id_0,id_2
1 id_0
2 id_1
3 id_0,id_1
4 id_2
5
dtype: object
答案 1 :(得分:3)
让我们试试np.argwhere
+ groupby
。
v = np.argwhere(df.values).T
(pd.DataFrame(
df.columns[v[1]], index=df.index[v[0]], columns=['result']
).groupby(level=0).agg(','.join).reindex(df.index)
)
result
0 id_0,id_2
1 id_0
2 id_1
3 id_0,id_1
4 id_2
5 NaN
答案 2 :(得分:2)
使用apply
和filter
df.mul(df.columns).apply(lambda x: ','.join(filter(bool, x)), 1)
0 id_0,id_2
1 id_0
2 id_1
3 id_0,id_1
4 id_2
5
dtype: object
答案 3 :(得分:1)
一种方法是尝试将lambda
与zip
和.join
一起使用:
df.apply(lambda x: ','.join(c for c, i in zip(x.index, x.values) if i != 0), axis=1)
结果:
0 id_0,id_2
1 id_0
2 id_1
3 id_0,id_1
4 id_2
5
dtype: object
答案 4 :(得分:1)
试试这个:
df['New'] = [','.join([str(df.columns[x]) for x,y in enumerate(list(i[-1])) if y==1]) for i in df.iterrows()]
print(df['New'])
输出:
0 id_0,id_2
1 id_0
2 id_1
3 id_0,id_1
4 id_2
5
Name: New, dtype: object