如何用Pandas将DataFrame指定单元格替换为Series对应值
问题与解决方案
原始数据
DataFrame
| INDEX | a | b | c |
|---|---|---|---|
| A | 5 | 7 | 2 |
| B | 3 | 2 | 1 |
| C | 9 | 6 | 3 |
替换用Series
| a | b | c |
|---|---|---|
| -1 | -4 | -5 |
需求
将DataFrame中≥6的单元格,按列名替换为Series中对应列的数值,最终得到如下结果:
目标输出
| INDEX | a | b | c |
|---|---|---|---|
| A | 5 | -4 | 2 |
| B | 3 | 2 | 1 |
| C | -1 | -4 | 3 |
问题点
用df[df>=6]能定位目标单元格,但执行df[df>=6] = series时触发报错,原因是Pandas无法自动将Series按列广播到DataFrame的行维度,维度对齐失败。
解决方法
方法1:使用where方法(简洁高效)
where方法默认保留满足条件的值,不满足则替换。这里反向判断,当值<6时保留原值,否则替换为Series对应列的值,指定axis=1确保按列对齐:
import pandas as pd # 初始化数据 df = pd.DataFrame({'a': [5, 3, 9], 'b': [7, 2, 6], 'c': [2, 1, 3]}, index=['A', 'B', 'C']) replace_series = pd.Series({'a': -1, 'b': -4, 'c': -5}) # 执行替换 df = df.where(df < 6, replace_series, axis=1) print(df)
方法2:广播Series为同结构DataFrame后赋值
先把Series转换成和原DataFrame行数一致的DataFrame,确保维度完全匹配后再赋值:
# 将Series扩展为与df同结构的DataFrame replace_df = pd.DataFrame([replace_series.values]*len(df), index=df.index, columns=df.columns) # 替换目标单元格 df[df >= 6] = replace_df[df >= 6]
内容的提问来源于stack exchange,提问作者Matan Solomon
相关产品推荐
相关产品推荐

