如何展平Pandas DataFrame中的Series列并生成带前缀字段列?
解决Pandas DataFrame展平Series列的需求
嘿,这个需求我熟!我帮你把包含字典列表的Applicant列展平成你要的Applicant.Name和Applicant.Age结构化列,两种实用方法送给你:
先确认你的原始数据
首先先把你的数据定义写清楚,方便后续测试:
import pandas as pd data = pd.DataFrame( [ ['TRAN', [{'Name':'Ben','Age':'24'}], 'T', 'Good'], ['LMI', [{'Name':'Zoe','Age':'32'}], 'U', 'Better'], ['ARN', [{'Name':'Jack','Age':'28'}], 'V', 'Best'] ], columns=['Type', 'Applicant', 'Decision', 'Action'] )
方法一:分步处理(直观易理解)
这种方法适合新手,每一步都清晰可控:
- 炸开列表:因为
Applicant列的每个元素是长度为1的列表,先用explode把列表展开成单独的字典行 - 解析字典:把字典列转换成单独的DataFrame
- 重命名列:给新列加上
Applicant.前缀,符合你的要求 - 合并数据:把原DataFrame的其他列和新解析的列合并,删除原
Applicant列
# 1. 炸开列表(每个列表只有一个元素,所以行数不变) exploded_df = data.explode('Applicant') # 2. 将字典列转换为结构化DataFrame applicant_details = exploded_df['Applicant'].apply(pd.Series) # 3. 重命名列名 applicant_details = applicant_details.rename( columns={'Name': 'Applicant.Name', 'Age': 'Applicant.Age'} ) # 4. 合并并清理数据 final_df = pd.concat([exploded_df.drop('Applicant', axis=1), applicant_details], axis=1)
方法二:简洁写法(适合快速实现)
如果你的Applicant列每个列表固定只有一个字典,可以用这种更简洁的写法:
# 提取每个列表的第一个字典,直接转为DataFrame applicant_df = pd.DataFrame(data['Applicant'].str[0].tolist()) # 重命名列后和原数据合并(删除原Applicant列) final_df = data.drop('Applicant', axis=1).join( applicant_df.rename(columns={'Name':'Applicant.Name', 'Age':'Applicant.Age'}) )
最终结果验证
两种方法得到的结果都是你要的结构:
Type Decision Action Applicant.Name Applicant.Age 0 TRAN T Good Ben 24 1 LMI U Better Zoe 32 2 ARN V Best Jack 28
注意事项
- 如果你的
Applicant列中存在包含多个字典的列表,方法一的explode会自动把每个字典拆成单独的行,而方法二只会取第一个字典,这时候需要根据你的业务需求调整 - 如果字典中的键不固定(比如有的字典没有
Age字段),apply(pd.Series)会自动填充NaN,适合处理异构数据
内容的提问来源于stack exchange,提问作者hanzgs
相关产品推荐
相关产品推荐

