Pandas从1.5.3升级到2.1后df.sum()报KeyError问题求助
Pandas 1.5.3升级到2.1后
value_counts().to_frame()列名变化导致KeyError的问题 问题原因
Pandas 2.0及以上版本对value_counts()方法的输出做了兼容性改动:
- 在1.5.3版本中,
df[col].value_counts()返回的Series的name属性是传入的col值,调用to_frame()后生成的DataFrame列名就是col; - 但在2.1版本中,
value_counts()返回的Series的name默认变为固定的count,因此to_frame()生成的DataFrame列名变成了count,而非原来的col值。
这就导致你的table函数中table.rename(columns={col: "Total"})这一行找不到对应的列名,最终生成的DataFrame里没有"Total"列,执行df["Total"].sum()时触发KeyError。
解决办法
有三种可行的修复方式,任选其一即可:
方式1:修改rename的目标列名为count
直接适配新版本的列名规则,把重命名的键从col换成count:
def table(df,col): table = df[col].value_counts().to_frame() # 这里把col换成"count" table = table.rename(columns={"count": "Total"}) table = table.reset_index() table = table.rename(columns={"index": "Type"}) return table
方式2:调用value_counts时指定name参数
强制让value_counts()返回的Series保持旧版本的name属性,这样后续代码无需修改:
def table(df,col): # 指定name参数为col,保持和旧版本一致 table = df[col].value_counts(name=col).to_frame() table = table.rename(columns={col: "Total"}) table = table.reset_index() table = table.rename(columns={"index": "Type"}) return table
方式3:不依赖具体列名,通过位置重命名
这种方式兼容新旧版本,不管列名是col还是count,直接取第一列重命名:
def table(df,col): table = df[col].value_counts().to_frame() # 取DataFrame的第一列进行重命名 table = table.rename(columns={table.columns[0]: "Total"}) table = table.reset_index() table = table.rename(columns={"index": "Type"}) return table
内容的提问来源于stack exchange,提问作者CreditcruncherX
相关产品推荐
相关产品推荐

