如何将含字典列表的DataFrame列拆分为独立列?
问题描述
现有DataFrame列df_cost['region.localCurrency'],数据格式如下:
df_cost['region.localCurrency']: 0 [{'content': 'Dirham', 'languageCode': 'EN'}] 1 [{'content': 'Dirham', 'languageCode': 'EN'}] 2 [{'content': 'Dirham', 'languageCode': 'EN'}] 3 [{'content': 'Euro', 'languageCode': 'DE'}] 4 [{'content': 'Euro', 'languageCode': 'DE'}] 5 [{'content': 'Euro', 'languageCode': 'DE'}] 6 [{'content': 'Euro', 'languageCode': 'DE'}] 7 [{'content': 'Euro', 'languageCode': 'DE'}] 8 [{'content': 'Euro', 'languageCode': 'DE'}] 9 [{'content': 'Euro', 'languageCode': 'DE'}] 10 [{'content': 'Euro', 'languageCode': 'DE'}] 11 [{'content': 'Euro', 'languageCode': 'DE'}] 12 [{'content': 'Euro', 'languageCode': 'DE'}] 13 [{'content': 'Dirham', 'languageCode': 'EN'}] 14 [{'content': 'Dirham', 'languageCode': 'EN'}] 15 [{'content': 'Dirham', 'languageCode': 'EN'}] 16 [{'content': 'Euro', 'languageCode': 'DE'}] 17 [{'content': 'Euro', 'languageCode': 'DE'}] 18 [{'content': 'Euro', 'languageCode': 'DE'}] 19 [{'content': 'Euro', 'languageCode': 'DE'}] Name: region.localCurrency, dtype: object
需求是将该列中的字典键值对拆分为localCurrencyContent和localCurrencyCode两列并添加到原df_cost中。尝试了以下代码:
df_split=pd.DataFrame(df_cost['region.localCurrency'].apply(pd.Series), columns=['localCurrencyContent', 'localCurrencyCode']) print(df_split)
但结果中两列均为NaN,未得到预期的'Euro'、'DE'等值。
解决方法
问题原因
原代码失败的核心原因:df_cost['region.localCurrency']的每一行是包含单个字典的列表,而非直接的字典对象。直接对列表调用apply(pd.Series)会将列表拆分为行级数据,但列表仅含一个元素,生成的DataFrame只有0列,指定的localCurrencyContent和localCurrencyCode列不存在,因此全为NaN。
正确实现方式
方式一:分步处理(清晰直观)
import pandas as pd # 1. 提取列表中的字典元素 df_cost['temp_dict'] = df_cost['region.localCurrency'].str[0] # 2. 将字典拆分为指定列 df_split = df_cost['temp_dict'].apply(pd.Series).rename( columns={'content': 'localCurrencyContent', 'languageCode': 'localCurrencyCode'} ) # 3. 合并到原DataFrame df_cost = pd.concat([df_cost, df_split], axis=1) # 4. 可选:删除临时列 df_cost.drop('temp_dict', axis=1, inplace=True)
方式二:链式操作(简洁高效)
无需创建临时列,直接通过lambda提取字典并拆分:
import pandas as pd df_cost[['localCurrencyContent', 'localCurrencyCode']] = df_cost['region.localCurrency'].apply( lambda x: pd.Series(x[0]) ).rename(columns={'content': 'localCurrencyContent', 'languageCode': 'localCurrencyCode'})
执行上述代码后,原df_cost会新增localCurrencyContent和localCurrencyCode两列,对应字典中的content和languageCode值。
内容的提问来源于stack exchange,提问作者kitten_world
相关产品推荐
相关产品推荐

