首页 > 解决方案 > 以其他列的名称作为值的 Pandas DataFrame 聚合列

问题描述

我正在尝试在 myDataFrame中创建一个新列,该列是聚合列名的列表。这是一个示例DataFrame

In [1]: df = pd.DataFrame({'A':[1,2,3],
               'B':[4,5,6],
               'C':[7,8,9],
               'D':[1,3,5],
               'E':[5,3,6],
               'F':[7,4,3]})
In [2]: df
Out[2]:
   A  B  C  D  E  F
0  1  4  7  1  5  7
1  2  5  8  3  3  4
2  3  6  9  5  6  3

我想创建一个新列,其中包含满足特定条件的列名列表。假设我对 value > 3 的列感兴趣——我想要一个如下所示的输出:

In [3]: df
Out[3]:
   A  B  C  D  E  F  Flag
0  1  4  7  1  5  7  ['B', 'C', 'E', 'F']
1  2  5  8  3  3  4  ['B', 'C', 'F']
2  3  6  9  5  6  3  ['B', 'C', 'D', 'E']

目前,我正在使用apply

df['Flag'] = df.apply(lambda row: [list(df)[i] for i, j in enumerate(row) if j > 3], axis = 1)

这可以完成工作,但感觉很笨重,我想知道是否有更优雅的解决方案。

谢谢!

标签: pythonpandaspandas-apply

解决方案


在这里使用df.dot()

df['Flag']=(df>3).dot(df.columns).apply(list)
print(df)

   A  B  C  D  E  F          Flag
0  1  4  7  1  5  7  [B, C, E, F]
1  2  5  8  3  3  4     [B, C, F]
2  3  6  9  5  6  3  [B, C, D, E]

推荐阅读