如何优化对同一pandas DataFrame列的多次apply调用写法
更优雅的实现方案
针对你多次对df['resume']列使用.apply()提取字段的场景,推荐两种更简洁高效的实现方式:
方案一:使用pd.json_normalize()直接展开嵌套JSON
如果df['resume']里的元素是字典格式(JSON结构),pandas的json_normalize()是专门处理这类嵌套数据的工具,能一次性把需要的字段展开成单独列,无需多次调用.apply():
import pandas as pd # 直接展开resume列的指定字段,支持嵌套路径(比如gender.id) expanded_df = pd.json_normalize(df['resume'], meta=['age', ['gender', 'id']]) # 重命名列名,让结果更清晰 expanded_df = expanded_df.rename(columns={'gender.id': 'gender'}) # 合并回原DataFrame df = pd.concat([df, expanded_df], axis=1)
这种方式无需手动判断字段是否存在,json_normalize()会自动为不存在的字段填充NaN(等价于你代码里的None),代码更简洁,性能也比多次.apply()更好。
方案二:自定义提取函数,单次.apply()生成多列
如果只需要提取部分特定字段,也可以写一个自定义函数,一次性返回所有需要的字段值,通过一次.apply()生成多列,减少重复操作:
def extract_resume_fields(resume_dict): return pd.Series({ 'age': resume_dict.get('age'), # get方法默认返回None,无需判断字段是否存在 'gender': resume_dict.get('gender', {}).get('id') # 嵌套字段用多层get,避免KeyError }) # 一次apply生成age和gender两列 df[['age', 'gender']] = df['resume'].apply(extract_resume_fields)
这里用字典的.get()方法替代了if...else判断,代码更简洁;同时通过返回pd.Series,让单次.apply()直接生成多列,避免了多次调用.apply()的冗余操作。
内容的提问来源于stack exchange,提问作者Paul Serikov
相关产品推荐
相关产品推荐

