如何在Python的Pandas中按条件重新分配DataFrame指定值?
实现Pandas DataFrame值分配需求:将Company A的A1000值同步到同年份B2000
需求说明
要将2010-2013年间,Company A的A1000对应的values值,替换为该公司同年份B2000的values值。
实现方法
这里提供两种简洁的落地方式:
方法一:字典映射赋值
先提取符合条件的A1000值构建年份映射,再定位目标行完成更新:
import pandas as pd # 生成示例DataFrame(修正原代码中"Comapny"的拼写错误为"Company") df = pd.DataFrame({'Year': [2010, 2010,2010,2010,2010,2011,2011,2011,2012,2012,2012,2012,2012,2013,2013,2013,2014], 'Company': ['A','A','A','B','B','A','B','C','A','B','B','B','C','A','B','C','D'], 'Code': ['A1000','B2000','C3000','A1000','B2000','B2000','B2000','B2000','A1000','A1000', 'B2000','C3000','A1000','B2000','C3000','A1000','A1000'], 'values': [1000,2000,3000,500,1000,2000,4000,4000,1500,4000,2000,6000,1000,5000,2000,1500,2000]} ) # 提取2010-2013年Company A的A1000值,构建「年份-对应值」的映射字典 a1000_map = df[(df['Company'] == 'A') & (df['Code'] == 'A1000') & (df['Year'].between(2010, 2013))].set_index('Year')['values'].to_dict() # 定位需要更新的目标行,用年份映射替换values update_mask = (df['Company'] == 'A') & (df['Code'] == 'B2000') & (df['Year'].between(2010, 2013)) df.loc[update_mask, 'values'] = df.loc[update_mask, 'Year'].map(a1000_map)
方法二:分组transform赋值
利用groupby和transform直接匹配同年份的A1000值,适合更复杂的分组场景:
# 筛选Company A且年份在2010-2013范围内的行 base_mask = (df['Company'] == 'A') & (df['Year'].between(2010, 2013)) # 对目标行赋值,自动匹配同年份的A1000值;若当年无A1000行则保留原值 df.loc[base_mask & (df['Code'] == 'B2000'), 'values'] = df[base_mask].groupby('Year')['values'].transform( lambda x: x[x.index.isin(df[base_mask & (df['Code'] == 'A1000')].index)].values[0] if len(x[x.index.isin(df[base_mask & (df['Code'] == 'A1000')].index)]) > 0 else x.iloc[0] )
验证结果
执行代码后,可通过以下命令查看更新后的关键行:
print(df[(df['Company'] == 'A') & (df['Code'].isin(['A1000', 'B2000']))])
输出会显示:2010年B2000的values变为1000(对应同年A1000的值),2013年B2000的values变为1500(对应同年A1000的值);2011年因无A1000行,保持原values不变。
内容的提问来源于stack exchange,提问作者Jiamei
相关产品推荐
相关产品推荐

