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

Pandas实现:将选中行的列值替换为另一个DataFrame的行值

问题描述

现有unique_allocations是一个包含4行不同数值的DataFrame(例如值为[1,2,3,4]),需求是将filtered_processed_full的每一行复制4次生成curr_df,并将curr_df的allocation_columns列替换为unique_allocations的对应值。

示例预期效果:
初始curr_df:

tacoallocation
01
01
01
01

转换后目标:

tacoallocation
01
02
03
04

但执行以下代码后,allocation_columns列并未按预期修改:

import pandas as pd

for idx, row in filtered_processed_full.iterrows():
    curr_df = pd.DataFrame()
    for i in range (4):
        curr_df = curr_df.append(row)
    curr_df[allocation_columns] = unique_allocations
    with pd.option_context('display.max_rows', None,
                       'display.max_columns', None,
                       'display.precision', 3,
                       ):
        print(curr_df[allocation_columns])
解决方案

问题根源

  1. 循环append导致索引不匹配:循环逐行append生成的curr_df,索引是原行索引的重复(比如原行索引为0,curr_df索引会是[0,0,0,0]),而unique_allocations索引通常是[0,1,2,3],直接赋值时Pandas会按索引匹配,导致重复赋值第一个值,无法实现预期。
  2. 赋值逻辑未按位置匹配:直接用curr_df[col] = df会优先按索引对齐,而非按行的位置顺序赋值。

修正代码

方式一:优化行复制+按位置赋值

用pd.DataFrame([row]*4)快速生成复制后的DataFrame,再通过.values忽略索引,按位置直接赋值:

import pandas as pd

for idx, row in filtered_processed_full.iterrows():
    # 快速生成4行重复的curr_df,索引自动重置为0-3
    curr_df = pd.DataFrame([row]*4)
    # 按位置赋值,跳过索引对齐
    curr_df[allocation_columns] = unique_allocations.values
    with pd.option_context('display.max_rows', None,
                           'display.max_columns', None,
                           'display.precision', 3,
                           ):
        print(curr_df[allocation_columns])

方式二:批量高效处理(避免逐行循环)

如果filtered_processed_full行数较多,逐行循环效率低,可直接批量处理整个DataFrame:

import pandas as pd

# 将原DataFrame的每一行复制4次
expanded_df = filtered_processed_full.loc[filtered_processed_full.index.repeat(4)].reset_index(drop=True)
# 按位置赋值重复的unique_allocations值(对应每4行一组)
expanded_df[allocation_columns] = pd.concat([unique_allocations]*len(filtered_processed_full), ignore_index=True).values

# 按原逻辑逐组打印
for idx in range(0, len(expanded_df), 4):
    curr_df = expanded_df.iloc[idx:idx+4]
    with pd.option_context('display.max_rows', None,
                           'display.max_columns', None,
                           'display.precision', 3,
                           ):
        print(curr_df[allocation_columns])

说明

  • 用[row]*4生成重复行再转DataFrame,会自动生成连续索引0-3,和unique_allocations的行位置对应。
  • 使用.values获取unique_allocations的数值数组,赋值时会直接按行顺序填充,跳过Pandas的索引对齐逻辑,确保值对应正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:52:50