操作Pandas DataFrame字典时代码无报错却未生效,求排查原因
问题原因及修正方案
核心错误点
未更新字典中的原DataFrame
循环里的item = ...只是给局部变量重新赋值,并没有修改字典里存储的原始DataFrame对象。字典中的item是原DataFrame的引用,但执行item = 新的DataFrame时,局部变量item会指向新对象,原字典的数据完全没变化。删除列头行的逻辑错误
原代码只检查第一列的值是否在列头列表中,这会误删第一列是Cust/Cont/Rate但其他列不匹配的行,同时也没精准匹配整行都是列头的目标行(比如示例中的第0行)。
修正后的代码
方案1:重新赋值回字典
colheaders = ['Cust','Cont','Rate'] for key, item in dico.items(): # 精准匹配整行等于列头的行并删除 mask = (item == colheaders).all(axis=1) cleaned_df = item.drop(item[mask].index) # 删除全空行和列 cleaned_df = cleaned_df.dropna(how='all') cleaned_df = cleaned_df.dropna(how='all', axis=1) # 将清洗后的DataFrame放回字典 dico[key] = cleaned_df
方案2:使用原地修改(inplace=True)
colheaders = ['Cust','Cont','Rate'] for key, item in dico.items(): # 删除整行匹配列头的行(原地修改) mask = (item == colheaders).all(axis=1) item.drop(item[mask].index, inplace=True) # 删除全空行和列(原地修改) item.dropna(how='all', inplace=True) item.dropna(how='all', axis=1, inplace=True)
补充说明
(item == colheaders).all(axis=1)会生成布尔掩码,精准筛选出整行内容与列头完全一致的行。- 两种方案都能解决原问题:方案1通过返回副本再赋值回字典,逻辑更清晰;方案2直接修改原DataFrame,内存占用更低。
内容的提问来源于stack exchange,提问作者christina
相关产品推荐
相关产品推荐

