如何基于多列条件实现Pandas DataFrame列的格式化填充?
问题:基于多列条件填充DataFrame的字符串列
原始DataFrame数据:
id values val1 val2 val3 1 1 1 0 2 0 0 0 3 1 0 1 4 0 1 0 5 1 1 1
需求说明
根据val1、val2、val3列的值填充values列,规则如下:
- 若
val1=1,添加"A" - 若
val2=1,添加"B" - 若
val3=1,添加"C"
多个符合条件的内容用-连接,无符合条件则留空。期望结果:
id values val1 val2 val3 1 A-B 1 1 0 2 0 0 0 3 A-C 1 0 1 4 B 0 1 0 5 A-B-C 1 1 1
用户尝试代码
df["values"] = df["val1"].astype(str).str.cat(df["val2"], sep= '-')
不清楚如何添加条件逻辑,寻求技术帮助。
解决方案
方法1:apply逐行处理(直观易读)
定义单行处理函数,判断各列值并收集对应字母,最后拼接:
def build_values(row): components = [] if row['val1'] == 1: components.append('A') if row['val2'] == 1: components.append('B') if row['val3'] == 1: components.append('C') return '-'.join(components) df['values'] = df.apply(build_values, axis=1)
逻辑清晰,适合列数较少的场景,规则修改方便。
方法2:向量化操作(高效处理大数据)
通过临时列实现向量化拼接,避免逐行循环的性能损耗:
# 生成对应字母的临时列,符合条件则保留字母,否则为空 df['A'] = df['val1'].map(lambda x: 'A' if x == 1 else '') df['B'] = df['val2'].map(lambda x: 'B' if x == 1 else '') df['C'] = df['val3'].map(lambda x: 'C' if x == 1 else '') # 拼接并清理多余分隔符 df['values'] = df[['A', 'B', 'C']].agg('-'.join, axis=1).str.strip('-').str.replace('--', '-') # 删除临时列 df.drop(['A', 'B', 'C'], axis=1, inplace=True)
方法3:列表推导式(简洁高效)
用列表推导式直接遍历行数据,代码紧凑:
df['values'] = [ '-'.join([char for char, val in zip(['A', 'B', 'C'], row) if val == 1]) for row in df[['val1', 'val2', 'val3']].values ]
兼顾可读性与执行效率,适合快速实现需求。
内容的提问来源于stack exchange,提问作者Ullan
相关产品推荐
相关产品推荐

