Pandas 0.23版本拆解DataFrame字典列报错,求有效解决方案
解决Pandas 0.23版本拆分字典列时的索引不匹配错误
我之前也碰到过类似的版本兼容坑,你的错误根源在于Pandas 0.23对fillna方法的参数校验逻辑做了严格调整——原来在0.22里能通过的「用长度为1的Series填充所有NaN」的方式,在0.23里会因为索引与数据长度不匹配直接报错。下面给你两个可行的解决方案:
方案一:结合apply和pd.Series处理
这是最直观的方式,先把NaN值替换成默认字典,再将每个字典自动拆分成多列:
import pandas as pd # 替换NaN为默认字典,再转为Series拆分列 dict_columns = df['dict_codes'].apply( lambda x: x if pd.notna(x) else {'code': 'not applicable'} ).apply(pd.Series) # 将拆分后的列合并回原DataFrame final_df = pd.concat([df, dict_columns], axis=1)
方案二:预处理列表后用from_records
如果你更习惯用from_records的写法,可以先手动处理字典列表里的NaN值,再生成新的DataFrame:
# 预处理字典列表,把NaN替换为默认字典 processed_list = [ item if pd.notna(item) else {'code': 'not applicable'} for item in df['dict_codes'].tolist() ] # 生成拆分后的列 dict_columns = pd.DataFrame.from_records(processed_list) # 合并到原数据 final_df = pd.concat([df, dict_columns], axis=1)
为什么原来的代码失效?
在Pandas 0.22中,fillna对传入的Series参数比较宽松:哪怕你创建的Series长度只有1,但只要指定了和原DataFrame一致的索引,它会自动广播填充所有NaN行。但0.23版本严格要求传入的Series长度必须和原DataFrame完全匹配,你写的pd.Series([{'code':'not applicable'}], index=df.index)实际只有1条数据,却要对应原DataFrame的多行,导致填充后的数据结构异常,最终触发ValueError: Length of passed values is 1, index implies x。
这两个方案都能在Pandas 0.23及以上版本稳定运行,逻辑也更清晰,避开了版本兼容的坑。
内容的提问来源于stack exchange,提问作者DBa
相关产品推荐
相关产品推荐

