如何让遍历DataFrame zip列表的循环作用于所有对象?
问题描述
创建两组DataFrame(df1/df2/df3 和 dv1/dv2/dv3),分别存入test和test2列表后打包为zipped_list。希望通过循环完成两项操作:
- 将
['product_name','item_name']设为索引,添加列层级键2022和2021 - 交换列层级,使同类型列相邻
但当前循环仅处理首个DataFrame,如何让循环作用于zipped_list中所有对象?
原代码如下:
import pandas as pd #Creating a set of dataframes data = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'item_name': ['hp', 'logitech', 'samsung', 'lg', 'lenovo'], 'price': [1200, 150, 300, 450, 200]} df1 = pd.DataFrame(data) data2 = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'item_name': ['hp', 'mac', 'fujitsu', 'lg', 'asus'], 'price': [2200, 200, 300, 450, 200]} df2 = pd.DataFrame(data2) data3 = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'item_name': ['microsoft', 'logitech', 'samsung', 'lg', 'asus'], 'price': [1500, 100, 200, 350, 400]} df3 = pd.DataFrame(data3) #Creating another set of dataframes data = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'item_name': ['hp', 'logitech', 'samsung', 'lg', 'lenovo'], 'price': [10, 20, 30, 40, 50]} dv1 = pd.DataFrame(data) data2 = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'item_name': ['hp', 'mac', 'fujitsu', 'lg', 'asus'], 'price': [10, 20, 30, 50, 50]} dv2 = pd.DataFrame(data2) data3 = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'item_name': ['microsoft', 'logitech', 'samsung', 'lg', 'asus'], 'price': [1, 2, 3, 4, 5]} dv3 = pd.DataFrame(data3) #creating a list for dataframe test=[df1,df2,df3] test2=[dv1,dv2,dv3] #combining two lists zipped = zip(test, test2) zipped_list = list(zipped) #Looping through the zipped_list for x,y in zipped_list: z=pd.concat([zipped_list[0][0].set_index(['product_name','item_name']), zipped_list[0][1].set_index(['product_name','item_name'])], axis='columns', keys=['2022', '2021']) z=z.swaplevel(axis='columns')[zipped_list[0][0].columns[2:]] print(z)
问题原因
循环内硬编码调用zipped_list[0][0]和zipped_list[0][1],始终只处理第一组DataFrame,没有使用循环迭代变量x和y;同时每次循环都会覆盖变量z,最后仅输出最后一次(重复处理第一组)的结果。
修正方案
使用循环迭代变量x和y处理每组数据,同时可以将处理结果存入列表统一管理,或直接在循环内输出每组结果:
import pandas as pd # 创建第一组DataFrame data = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'item_name': ['hp', 'logitech', 'samsung', 'lg', 'lenovo'], 'price': [1200, 150, 300, 450, 200]} df1 = pd.DataFrame(data) data2 = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'item_name': ['hp', 'mac', 'fujitsu', 'lg', 'asus'], 'price': [2200, 200, 300, 450, 200]} df2 = pd.DataFrame(data2) data3 = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'item_name': ['microsoft', 'logitech', 'samsung', 'lg', 'asus'], 'price': [1500, 100, 200, 350, 400]} df3 = pd.DataFrame(data3) # 创建第二组DataFrame data = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'item_name': ['hp', 'logitech', 'samsung', 'lg', 'lenovo'], 'price': [10, 20, 30, 40, 50]} dv1 = pd.DataFrame(data) data2 = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'item_name': ['hp', 'mac', 'fujitsu', 'lg', 'asus'], 'price': [10, 20, 30, 50, 50]} dv2 = pd.DataFrame(data2) data3 = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'item_name': ['microsoft', 'logitech', 'samsung', 'lg', 'asus'], 'price': [1, 2, 3, 4, 5]} dv3 = pd.DataFrame(data3) # 存入列表并打包 test = [df1, df2, df3] test2 = [dv1, dv2, dv3] zipped_list = list(zip(test, test2)) # 循环处理所有组 results = [] for x, y in zipped_list: # 使用当前迭代的x和y设置索引并合并 combined = pd.concat( [x.set_index(['product_name', 'item_name']), y.set_index(['product_name', 'item_name'])], axis='columns', keys=['2022', '2021'] ) # 交换列层级,按原数据列排序(这里明确取'price'列更直观) combined = combined.swaplevel(axis='columns')['price'] results.append(combined) # 可选:直接打印当前组结果 print("处理后的DataFrame:") print(combined) print("-" * 50) # 后续可通过results列表访问所有处理后的DataFrame # 例如print(results[1])查看第二组结果
关键修正点
- 替换硬编码的
zipped_list[0][0]/zipped_list[0][1]为循环变量x和y,确保每次循环处理当前组的DataFrame - 使用
results列表存储所有处理后的结果,避免数据被覆盖 - 交换层级后直接指定
['price']列,比x.columns[2:]更直观(原DataFrame仅3列,索引后剩余price列)
内容的提问来源于stack exchange,提问作者user18708380
相关产品推荐
相关产品推荐

