python - python pandas - 如何为每一行创建一个带有条件的列名列表?
问题描述
我需要对数据框的所有行应用一个函数我使用了这个函数,如果值为 1,则返回列名列表:
def find_column(x):
a=[]
for column in df.columns:
if (df.loc[x,column] == 1):
a = a + [column]
return a
如果我只插入索引,它就可以工作,例如:
print(find_column(1))
但:
df['new_col'] = df.apply(find_column,axis=1)
没有任何想法?谢谢!
解决方案
您可以按每一行进行迭代,因此x
列Series
名index
相同,因此可以过滤索引匹配的数据并转换为列表:
df = pd.DataFrame({
'A':list('abcdef'),
'B':[4,1,4,5,5,1],
'C':[7,1,9,4,2,3],
'D':[1,1,5,7,1,1],
'E':[5,1,6,9,1,4],
'F':list('aaabbb')
})
def find_column(x):
return x.index[x == 1].tolist()
df['new'] = df.apply(find_column,axis=1)
print (df)
A B C D E F new
0 a 4 7 1 5 a [D]
1 b 1 1 1 1 a [B, C, D, E]
2 c 4 9 5 6 a []
3 d 5 4 7 9 b []
4 e 5 2 1 1 b [D, E]
5 f 1 3 1 4 b [B, D]
另一个想法是使用DataFrame.dot
with mask by DataFrame.eq
for equal,然后删除最后一个分隔符并使用Series.str.split
:
df['new'] = df.eq(1).dot(df.columns + ',').str.rstrip(',').str.split(',')
print (df)
A B C D E F new
0 a 4 7 1 5 a [D]
1 b 1 1 1 1 a [B, C, D, E]
2 c 4 9 5 6 a []
3 d 5 4 7 9 b []
4 e 5 2 1 1 b [D, E]
5 f 1 3 1 4 b [B, D]
推荐阅读
- gcc - 如何修复“警告 #1173-D:属性“已弃用”被忽略?
- python - Sagemaker 调用端点返回值类型?
- android - ConditionVariable 在 AsyncTask 中不起作用
- ios - 在 ios 11 中的 whatsapp 上共享带有标题的图像
- html - 输入元素的 HTML 模式验证
- excel - 根据另一个单元格的内容将格式应用于单元格的一部分
- php - 如何将 a 标签包裹在 div 标签周围?
- c# - Try-Catch 中的“catch”是哪种数据结构或构造
- python - 检查 uint16 是否在范围内的最快方法,包括溢出时换行
- reactjs - React - 冒号被替换