You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让遍历DataFrame zip列表的循环作用于所有对象?

问题描述

创建两组DataFrame(df1/df2/df3 和 dv1/dv2/dv3),分别存入test和test2列表后打包为zipped_list。希望通过循环完成两项操作:

  1. 将['product_name','item_name']设为索引,添加列层级键2022和2021
  2. 交换列层级,使同类型列相邻

但当前循环仅处理首个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])查看第二组结果
关键修正点
  1. 替换硬编码的zipped_list[0][0]/zipped_list[0][1]为循环变量x和y,确保每次循环处理当前组的DataFrame
  2. 使用results列表存储所有处理后的结果,避免数据被覆盖
  3. 交换层级后直接指定['price']列,比x.columns[2:]更直观(原DataFrame仅3列,索引后剩余price列)

内容的提问来源于stack exchange,提问作者user18708380

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:45:32