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

如何在Pandas数据框中利用现有列名和值创建列表型新列?

Hey there! 看到你正在从R拓展到Python/Pandas的技能栈,这个需求我刚好能帮你搞定。你要实现的是给DataFrame新增一列,每行是由值为'1'的列名去掉'test'前缀后用'-'连接成的字符串对吧?我给你两种实现方式,一种直观易懂,另一种更适合大数据集的高效处理。

先准备示例数据

首先构造一个匹配你需求的示例DataFrame,方便你测试:

import pandas as pd

df = pd.DataFrame({
    'test_a': [1, 0, 1],
    'test_b': [0, 1, 1],
    'test_c': [1, 1, 0],
    'extra_col': ['foo', 'bar', 'baz']  # 非test开头的列不会被处理
})

方法1:逐行处理(直观易懂)

这个思路和你用R/data.table的逻辑很接近,用apply配合自定义函数实现:

def build_combined_string(row):
    # 筛选当前行值为1的列名
    target_cols = row[row == 1].index
    # 去掉'test_'前缀(如果你的列名是'testxxx'无下划线,换成col.lstrip('test')即可)
    cleaned_names = [col.replace('test_', '') for col in target_cols]
    # 用'-'连接成字符串
    return '-'.join(cleaned_names)

# 新增名为'combined'的目标列
df['combined'] = df.apply(build_combined_string, axis=1)

运行后得到的结果:

test_a  test_b  test_c extra_col combined
0       1       0       1       foo    a-c
1       0       1       1       bar    b-c
2       1       1       0       baz    a-b

方法2:向量化处理(高效适合大数据)

如果你的数据集规模较大,逐行apply的性能会受限,推荐用向量化操作,和data.table的高效处理思路一致:

# 先筛选出所有以'test'开头的列
test_columns = [col for col in df.columns if col.startswith('test')]
# 创建布尔矩阵,标记每行中哪些列的值为1
bool_df = df[test_columns] == 1

# 对每行拼接符合条件的列名
df['combined'] = bool_df.apply(
    lambda x: '-'.join([col.replace('test_', '') for col, is_true in x.items() if is_true]),
    axis=1
)

这个方法减少了逐行循环的开销,在处理十万级以上数据时优势会很明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:19:19