如何在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
相关产品推荐
相关产品推荐

