如何在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,提问作者Любовь Пономарева
相关产品推荐
相关产品推荐

