You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas如何根据值非零条件将对应列名赋值给行的新增列

Pandas逐行拼接非0值列名实现方法

需求说明

针对DataFrame的每一行,筛选取值不为0的列,将这些列的列名用英文逗号拼接后,赋值给新增的Col_name字段。

实现代码

基础实现(易读性优先)

import pandas as pd

# 测试数据构造
df = pd.DataFrame({
    'date' : ['2021-08-01', '2021-08-01', '2021-08-01', '2021-08-02', '2021-08-02', '2021-08-02'],
    'person': ['type_A', 'type_C', 'type_C', 'type_A', 'type_B', 'type_D'],
    'London' : [1, 4, 0, 5, 7, 9],
    'New York' : [0.0, 0.0, 3, 0.0, 0.0, 0.0],
    'Boston' : [3, 6, 9, 1, 0.0, 7],
    'Hong Kong' : [0.0, 0.0, 0.0, 0.0, 3, 0.0]
})

# 指定需要校验非0值的列,排除无需参与判断的date、person字段
check_columns = ['London', 'New York', 'Boston', 'Hong Kong']

# 逐行筛选非0值对应的列名,拼接后赋值
df['Col_name'] = df[check_columns].apply(lambda row: ', '.join(row[row != 0].index), axis=1)

print(df)

高效实现(大数量场景优先)

如果处理的DataFrame数据量较大,逐行apply的性能较低,可以使用矩阵运算的方式提速:

# 布尔矩阵点积实现,避免逐行遍历,性能提升显著
df['Col_name'] = df[check_columns].ne(0).dot(check_columns + ',').str.rstrip(',')

输出结果

运行上述代码后得到的结果符合逻辑要求:

date  person  London  New York  Boston  Hong Kong          Col_name
0  2021-08-01  type_A       1       0.0     3.0        0.0     London, Boston
1  2021-08-01  type_C       4       0.0     6.0        0.0     London, Boston
2  2021-08-01  type_C       0       3.0     9.0        0.0   New York, Boston
3  2021-08-02  type_A       5       0.0     1.0        0.0     London, Boston
4  2021-08-02  type_B       7       0.0     0.0        3.0  London, Hong Kong
5  2021-08-02  type_D       9       0.0     7.0        0.0     London, Boston

注:你给出的预期输出中第5行Col_name多了Hong Kong,属于和原始数据冲突的笔误,上述输出为符合逻辑的正确结果。

内容的提问来源于stack exchange,提问作者codedancer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 19:45:04