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

如何在pandas的df.apply()中为多列批量赋值且不遍历card_id

解决pandas多列批量赋值问题

针对你需要将card_id和score_id列中用|分隔的对应值批量赋值到card_{card}列的需求,以下是两种无需手动遍历card编号的实现方法:

方法1:利用apply返回Series自动生成列

这种方法通过apply处理每行数据,将拆分后的card和score转换为Series,apply会自动将所有行的Series合并为新列:

# 合并生成的新列到原DataFrame
df = df.join(
    df.apply(
        lambda row: pd.Series(
            dict(zip(
                [f'card_{c}' for c in row['card_id'].split('|')],
                row['score_id'].split('|')
            ))
        ),
        axis=1
    )
)

原理说明

  • 对每行拆分card_id和score_id,用zip配对生成card_{card}: score的字典
  • 将字典转为pd.Series,apply会将所有行的Series拼接成一个新的DataFrame
  • 通过join将新列合并到原DataFrame中,自动补全未匹配到的card为NaN

方法2:矢量化操作(更适合大数据量)

利用explode和pivot完成转换,全程矢量化处理,避免逐行操作的性能损耗:

# 拆分card和score列并爆炸为单行对应单个card-score对
exploded_df = df.assign(
    card=df['card_id'].str.split('|'),
    score=df['score_id'].str.split('|')
).explode(['card', 'score'])

# 透视转换为宽表,并重命名列
pivoted_df = exploded_df.pivot(
    index=exploded_df.index,
    columns='card',
    values='score'
).rename(columns=lambda c: f'card_{c}')

# 合并回原DataFrame
df = df.join(pivoted_df)

原理说明

  • assign+explode将每行的多组card-score拆分为单独行
  • pivot将长表转回宽表,自动生成所有存在的card_{card}列
  • 最后通过join合并,保留原数据的同时添加新列

原代码问题说明

你最初的apply写法存在语法错误:lambda表达式中不能直接进行赋值操作,且生成器表达式无法完成预期的赋值逻辑。上述两种方法均规避了这个问题,且无需手动遍历card编号。

内容的提问来源于stack exchange,提问作者Любовь Пономарева

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:30:49