首页 > 解决方案 > 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)

没有任何想法?谢谢!

标签: pythonpandasapply

解决方案


您可以按每一行进行迭代,因此xSeriesindex相同,因此可以过滤索引匹配的数据并转换为列表:

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.dotwith mask by DataFrame.eqfor 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]

推荐阅读