Pandas实现:将选中行的列值替换为另一个DataFrame的行值
问题描述
现有unique_allocations是一个包含4行不同数值的DataFrame(例如值为[1,2,3,4]),需求是将filtered_processed_full的每一行复制4次生成curr_df,并将curr_df的allocation_columns列替换为unique_allocations的对应值。
示例预期效果:
初始curr_df:
| taco | allocation |
|---|---|
| 0 | 1 |
| 0 | 1 |
| 0 | 1 |
| 0 | 1 |
转换后目标:
| taco | allocation |
|---|---|
| 0 | 1 |
| 0 | 2 |
| 0 | 3 |
| 0 | 4 |
但执行以下代码后,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])
解决方案
问题根源
- 循环
append导致索引不匹配:循环逐行append生成的curr_df,索引是原行索引的重复(比如原行索引为0,curr_df索引会是[0,0,0,0]),而unique_allocations索引通常是[0,1,2,3],直接赋值时Pandas会按索引匹配,导致重复赋值第一个值,无法实现预期。 - 赋值逻辑未按位置匹配:直接用
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
相关产品推荐
相关产品推荐

