如何在Lambda函数中用\n和\t填充DataFrame空值并格式化输出
问题描述
我有一个包含10万行、300列的大规模DataFrame,需要从其他列提取值填充EVENT_DTL列的NaN值。示例DataFrame如下:
NAME RRN_FRONT RRN_BACK EVENT_DTL 1 JOHN 891105 1067714 NaN 2 SHOWN 791134 1156543 NaN 3 BROWN 581104 1668314 NaN 4 MIKE 984564 0153422 1. Name : MIKE 2. BIRTHDAY : 984564 3. SSN : 0153422 5 LARRY 796515 0168165 1. Name : LARRY 2. BIRTHDAY : 796515 3. SSN : 0168165
期望将NaN值替换为包含NAME、RRN_FRONT、RRN_BACK的指定多行缩进格式内容。现有代码执行后输出格式错误,无法得到预期的换行缩进效果:
df.loc[df.EVENT_DTL.isnull(), 'EVENT_DTL'] = df.apply(lambda x: ('1. NAME : ' + str(x['NAME']) + '\n2. BIRTHDAY : ' + str(x['RRN_FRONT']) + '\n3. SSN : ' + str(x['RRN_BACK']),axis=1)
解决方案
1. 核心问题分析
原代码存在两个问题:一是语法错误(axis=1的括号位置错误);二是缺少缩进空格,无法匹配示例中的多行缩进格式。同时,针对10万行的大数据量,apply逐行操作效率偏低,优先推荐向量化处理。
2. 高效实现方案(向量化拼接,推荐)
# 筛选出需要填充的行 mask = df['EVENT_DTL'].isnull() # 构造带缩进的多行内容,空格数量可按需调整 df.loc[mask, 'EVENT_DTL'] = ( '1. Name : ' + df.loc[mask, 'NAME'] + '\n' + ' ' * 30 + '2. BIRTHDAY : ' + df.loc[mask, 'RRN_FRONT'].astype(str) + '\n' + ' ' * 30 + '3. SSN : ' + df.loc[mask, 'RRN_BACK'].astype(str) )
此方法利用Pandas的向量化字符串操作,处理10万行数据的速度远快于逐行apply,且能精准实现缩进格式。
3. 修正apply版本(适合小数据量场景)
如果坚持使用apply,需修正语法并添加缩进:
df.loc[df['EVENT_DTL'].isnull(), 'EVENT_DTL'] = df.apply( lambda x: ( '1. Name : ' + str(x['NAME']) + '\n' + ' ' * 30 + '2. BIRTHDAY : ' + str(x['RRN_FRONT']) + '\n' + ' ' * 30 + '3. SSN : ' + str(x['RRN_BACK']) ), axis=1 )
4. 效果验证
执行后,JOHN对应的EVENT_DTL内容将与示例格式一致:
1. Name : JOHN 2. BIRTHDAY : 891105 3. SSN : 1067714
内容的提问来源于stack exchange,提问作者Chung Joshua
相关产品推荐
相关产品推荐

