如何在不使用apply的情况下将Pandas单元格值转为字典并保留原值
用向量化方法将Pandas列转换为字典格式
需求回顾
你有包含字符串和NaN值的DataFrame列:
import pandas as pd import numpy as np df = pd.DataFrame({'column': ['a', 'b', np.nan, 'c']})
需要将其转换为每个元素是{'key': 值}的字典,其中NaN对应{'key': None},最终效果:
df['column'] = [{'key': 'a'}, {'key': 'b'}, {'key': None}, {'key': 'c'}]
向量化解决方案
方法1:结合fillna与列表推导式(高效推荐)
先通过向量化的fillna将所有NaN替换为None,再用列表推导式批量生成字典:
# 向量化替换NaN为None processed_col = df['column'].fillna(None) # 批量生成字典列表 df['column'] = [{'key': val} for val in processed_col]
如果需要同时处理空字符串(和你原代码逻辑一致),可以先将空字符串替换为NaN:
# 先替换空字符串为NaN,再转None processed_col = df['column'].replace('', np.nan).fillna(None) df['column'] = [{'key': val} for val in processed_col]
方法2:简化版map操作
用map替代apply,逻辑更简洁,比原代码的lambda判断更精简:
df['column'] = df['column'].map(lambda x: {'key': x} if pd.notna(x) else {'key': None}) # 包含空字符串处理的版本 df['column'] = df['column'].map(lambda x: {'key': x} if pd.notna(x) and x != '' else {'key': None})
向量化的优势
你原有的apply方法是逐元素遍历判断,而fillna和replace都是Pandas底层用C实现的向量化操作,在数据量较大时,效率会远高于逐元素的apply;列表推导式则是Python原生的批量操作,比apply的函数调用开销更小。
内容的提问来源于stack exchange,提问作者Valerio
相关产品推荐
相关产品推荐

