为何字典中pandas DataFrame批量移除短字符串行不生效?
问题:循环修改字典中的DataFrame过滤行未生效的原因与解决办法
我来帮你拆解这个问题的本质,以及搞定它的正确姿势~
为什么第一次循环生效,第二次过滤却不行?
先搞懂两个循环的本质区别:
- 你第一次添加
Productsize列时,循环里的ii是字典中对应DataFrame的引用。因为DataFrame是可变对象,直接修改ii的列(比如ii['Productsize'] = ...)会直接同步修改字典里存储的原DataFrame,所以这一步生效了。 - 但当你写
ii=ii[~(ii['Productsize'] <= 6)]时,这行代码是创建了一个全新的DataFrame对象,此时ii这个变量只是指向了这个新对象,而字典里原来的旧DataFrame根本没被替换——这就是为什么单独处理df1=df1[...]能生效,因为你直接把新对象覆盖了原来的df1变量,而循环里没把新对象写回字典。
正确的解决代码
你后来尝试的df_dict[i] = ii[~(...)]思路是对的,可能是没验证对结果?或者可以把两个循环合并更高效,比如:
import pandas as pd # 初始化你的数据 df1=pd.DataFrame({'product':['ajoijoft','bbhjbh','cser','sesrd','yfgjke','tfyfyf','drdrtjg'],'price':[1,2,3,4,5,6,7],'label':['h','i','j','k','L','n','m']}) df2=pd.DataFrame({'product':['ajyughjoijoft','bdrddbhjbh','rdtrdcser','sdtrdthddesrd','yawafgjke','tesrgsfyfyf','sresedrdrtjg'],'price':[1,2,3,4,5,6,7],'label':['h','i','j','k','L','n','m']}) df3=pd.DataFrame({'product':['joijoft','bdbhjbh','rdcser','sdhddesrd','wajke','yf','sresedrdrtjg'],'price':[1,2,3,4,5,6,7],'label':['h','i','j','k','L','n','m']}) df_dict = {"A":df1,'B':df2, "C":df3} # 一次循环完成添加列+过滤操作,并写回字典 for key, df in df_dict.items(): # 先添加长度列 df['Productsize'] = df['product'].str.len() # 过滤后把新DataFrame赋值回字典的对应键 df_dict[key] = df[~(df['Productsize'] <= 6)] # 验证结果(可以删掉这部分) for key, filtered_df in df_dict.items(): print(f"===== 键 {key} 的过滤后数据 =====") print(filtered_df[['product', 'Productsize']])
如果还是不行,检查这几点:
- 确认
Productsize列确实被正确计算了:可以在循环里加print(df['Productsize'])看看数值是否符合预期。 - 检查过滤逻辑:
~(df['Productsize'] <=6)等价于保留长度大于6的行,确认这是你想要的规则。 - 变量名拼写:确保
Productsize的大小写在所有地方都一致(比如不要一会儿大写开头一会儿小写)。
内容的提问来源于stack exchange,提问作者Tom_Hanks
相关产品推荐
相关产品推荐

