嵌套for循环构建多层字典式pd.DataFrame时过滤结果异常如何解决?
问题:嵌套字典中Pandas DataFrame过滤结果不符合预期
你试图构建一个嵌套字典,让cities[city][letter]['df']返回匹配对应city和letter的DataFrame,但实际所有城市的同字母条目都指向最后一次循环的结果(LA对应的数据)。
问题根源
你的代码中复用了letters字典里的同一个字典对象。循环里修改inner_dict['df']时,所有引用这个对象的位置都会被覆盖,最终所有城市的同一个letter条目都指向最后一次循环赋值的DataFrame(也就是LA循环时生成的结果)。
解决方案
方案1:修改原循环,每次创建新字典
直接调整循环逻辑,避免复用letters里的字典对象,每次循环生成新的字典存入嵌套结构:
import pandas as pd data = { 'city': ['NY', 'LA', 'NY', 'LA', 'NY'], 'letter': ['A', 'B', 'C', 'A', 'B'] } cities = { 'NY': {}, 'LA': {} } for city, outer_dict in cities.items(): for letter in ['A', 'B', 'C']: df = pd.DataFrame(data) # 合并过滤条件,更高效 df = df[(df['city'] == city) & (df['letter'] == letter)] # 每次创建新的字典,避免对象复用 outer_dict[letter] = {'df': df} print(cities['NY']['A'])
方案2:用字典推导式简化代码
用嵌套字典推导式一次性生成结果,代码更简洁且可读性强:
import pandas as pd data = { 'city': ['NY', 'LA', 'NY', 'LA', 'NY'], 'letter': ['A', 'B', 'C', 'A', 'B'] } df = pd.DataFrame(data) cities = { city: { letter: {'df': df[(df['city'] == city) & (df['letter'] == letter)]} for letter in ['A', 'B', 'C'] } for city in ['NY', 'LA'] } print(cities['NY']['A'])
方案3:利用Pandas GroupBy高效处理(适合大数据场景)
如果业务数据量较大,重复过滤DataFrame会浪费性能,用groupby一次性分组后构建字典更高效:
import pandas as pd data = { 'city': ['NY', 'LA', 'NY', 'LA', 'NY'], 'letter': ['A', 'B', 'C', 'A', 'B'] } df = pd.DataFrame(data) cities = {} # 按city和letter分组,直接获取对应分组的DataFrame for (city, letter), group_df in df.groupby(['city', 'letter']): if city not in cities: cities[city] = {} cities[city][letter] = {'df': group_df} # 补充没有匹配数据的条目(比如LA的C),保持结构完整性 for city in ['NY', 'LA']: for letter in ['A', 'B', 'C']: if letter not in cities.get(city, {}): cities[city][letter] = {'df': pd.DataFrame(columns=df.columns)} print(cities['NY']['A'])
以上三种方案都能让cities['NY']['A']正确返回预期的DataFrame。
内容的提问来源于stack exchange,提问作者WalrusMonger
相关产品推荐
相关产品推荐

