Python中DataFrame两列值匹配与Small List列对应行赋值
高效实现Pandas DataFrame列值匹配与赋值
问题分析
你需要将Small List列中的非0有效值,匹配到Big List列对应值的行,将这些行的Small List设为匹配值,其余行填0。核心是避免低效的逐行循环,利用Pandas的矢量化操作完成批量处理。
修正输入数据
首先你提供的代码中Small List的长度和Big List不匹配,会导致DataFrame创建失败,先修正输入:
import pandas as pd data = {'Big List': [10, 20, 30, 40, 50, 60, 20], 'Small List': [20, 30, 60, 0, 0, 0, 0]} df = pd.DataFrame(data)
高效实现方案
利用Pandas的isin()和where()方法完成矢量化赋值,这比iterrows()循环效率高几个数量级,尤其适合大数据集:
# 提取Small List中的非0有效值并去重 target_values = df[df['Small List'] != 0]['Small List'].unique() # 批量赋值:Big List值在目标列表中则保留原值,否则设为0 df['Small List'] = df['Big List'].where(df['Big List'].isin(target_values), 0)
代码解释
- 提取目标值:筛选
Small List中所有非0的值,用unique()去重减少重复判断,提升效率。 - 矢量化赋值:
df['Big List'].isin(target_values)生成布尔数组,标记哪些行的Big List值在目标列表中;where()方法会将布尔值为True的行保留Big List的值,False的行设为0。
验证结果
执行后得到的DataFrame与你期望的输出完全一致:
| Big List | Small List |
|---|---|
| 10 | 0 |
| 20 | 20 |
| 30 | 30 |
| 40 | 0 |
| 50 | 0 |
| 60 | 60 |
| 20 | 20 |
为什么不用循环?
iterrows()是逐行遍历处理,每一行都要单独操作,Pandas在处理大数据时会非常慢。而矢量化操作基于底层C语言实现,批量处理数据,效率提升显著。
内容的提问来源于stack exchange,提问作者Pouria Paimard
相关产品推荐
相关产品推荐

