Pandas如何将DataFrame某列值作为索引取值并赋值给新列
问题场景
操作流程:
- 先将符合条件的索引值赋值给
A列,调用df.ffill()对该列做向前填充处理 - 后续需要把
A列存储的值作为行索引,取出对应行的price列取值,赋值给expected列 - 尝试使用代码
df['expected']=df['price'][df['A']]实现该需求,但运行未得到正确结果
测试复现代码
import pandas as pd import numpy as np d={'trade_date':['2021-08-10','2021-08-11','2021-08-12','2021-08-13','2021-08-14','2021-08-15','2021-08-16','2021-08-17','2021-08-18','2021-08-19','2021-08-20',],'price':[2,12,8,10,11,18,7,19,9,8,12],'cond':[True,False,True,False,True,False,True,False,True,True,True]} df = pd.DataFrame(d) df.index=pd.to_datetime(df.trade_date) df['A']=df.index.where(df['cond']) df['A']=df['A'].ffill()
预期输出结果
| trade_date | price | cond | A | expected |
|---|---|---|---|---|
| 2021/8/10 | 2 | TRUE | 2021/8/10 | 2 |
| 2021/8/11 | 12 | FALSE | 2021/8/10 | 2 |
| 2021/8/12 | 8 | TRUE | 2021/8/12 | 8 |
| 2021/8/13 | 10 | FALSE | 2021/8/12 | 8 |
| 2021/8/14 | 11 | TRUE | 2021/8/14 | 11 |
| 2021/8/15 | 18 | FALSE | 2021/8/14 | 11 |
| 2021/8/16 | 7 | TRUE | 2021/8/16 | 7 |
| 2021/8/17 | 19 | FALSE | 2021/8/16 | 7 |
| 2021/8/18 | 9 | TRUE | 2021/8/18 | 9 |
| 2021/8/19 | 8 | TRUE | 2021/8/19 | 8 |
| 2021/8/20 | 12 | TRUE | 2021/8/20 | 12 |
错误原因
原写法df['price'][df['A']]触发了pandas的索引对齐逻辑:用A列的日期值作为标签取price的子集时,返回结果的索引是A列的日期集合,和原DataFrame的行索引无法匹配,最终赋值会出现错位、空值问题。
正确实现代码
用map方法做标签到值的直接映射即可,不会触发索引对齐问题,运行结果和预期完全一致:
df['expected'] = df['A'].map(df['price'])
内容的提问来源于stack exchange,提问作者junyu
相关产品推荐
相关产品推荐

