为何用DataFrame.to_dict()生成嵌套字典无法用于重命名列?
为何嵌套字典无法用于重命名DataFrame列?
Pandas的列重命名操作(不管是直接赋值给columns属性,还是使用rename()方法),都要求映射关系必须是原列名作为键、新列名作为值的单层字典。嵌套字典的结构完全不符合这个输入要求,所以无法直接用来重命名列。
分析两种代码实现
代码示例1:生成嵌套字典的问题
# Rename columns cen_columns = cen_columns[['VARIABLE','LABEL_CLEAN']].set_index("VARIABLE").to_dict() census_age.columns = census_age.columns.to_series().map(cen_columns['LABEL_CLEAN'])
这段代码里,set_index("VARIABLE").to_dict()默认会生成嵌套字典:
{'LABEL_CLEAN': {'B01001_001E': 'Total', 'B01001_002E': 'Male', 'B01001_003E': 'Male_Under_5', ...}}
这个嵌套字典的外层键是原DataFrame的列名LABEL_CLEAN,内层才是我们需要的列名映射关系。如果直接把这个嵌套字典传给rename(columns=...),Pandas会把LABEL_CLEAN当成要重命名的原列名,显然不符合需求。
你代码里通过cen_columns['LABEL_CLEAN']提取出了内层的单层字典,这一步其实是可以实现重命名的,但嵌套字典本身无法直接用于重命名操作。
代码示例2:单层字典的适配性
#Rename Columns cen_columns = dict(zip(cen_columns['VARIABLE'], cen_columns['LABEL_CLEAN'])) census_age.rename(columns=cen_columns,inplace=True) census_age.head(2)
dict(zip(...))直接生成了{原列名: 新列名}的单层字典:
{'B01001_001E': 'Total', 'B01001_002E': 'Male', 'B01001_003E': 'Male_Under_5'....}
这种结构完全匹配Pandas重命名方法的参数要求,所以能直接生效。
优化代码示例1的写法
其实可以调整代码1的写法,直接生成单层字典,不用嵌套:
cen_columns = cen_columns.set_index("VARIABLE")['LABEL_CLEAN'].to_dict() census_age.rename(columns=cen_columns, inplace=True)
先通过set_index("VARIABLE")['LABEL_CLEAN']得到以原列名为索引的Series,再转成字典,就能直接得到符合要求的单层映射字典。
内容的提问来源于stack exchange,提问作者Tinkinc
相关产品推荐
相关产品推荐

