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

如何基于多列条件实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:07:16