使用Pandas的apply函数基于列条件生成result列的技术问题
生成result列的解决方案
问题说明
处理一批数据时,需生成result列:
- 若
top_tier不为空,result列留空 - 若
top_tier为空,result列返回所属的上级区域
试过ffill和apply方法未得到预期结果,原本思路是用apply函数在top_tier为空时返回上方区域值,移除top_tier行后再执行ffill。
数据示例
| region | admissions_total | year | top_tier | result |
|---|---|---|---|---|
| England | 292404 | 2014 | TRUE | |
| North East | 17409 | 2014 | TRUE | |
| North East | 17409 | 2014 | TRUE | |
| County Durham | 2240 | 2014 | North East | |
| Darlington | 283 | 2014 | North East | |
| North West | 41358 | 2014 | TRUE | |
| North West | 41358 | 2014 | TRUE | |
| Ashton, Leigh & Wigan | 1943 | 2014 | North West | |
| Blackburn With Darwen Care Trust Plus | 865 | 2014 | North West | |
| East Midlands | 19256 | 2014 | TRUE | |
| East Midlands | 19256 | 2014 | TRUE | |
| Bassetlaw | 428 | 2014 | East Midlands | |
| Derby | 2524 | 2014 | East Midlands |
实现代码
直接用Pandas的条件赋值结合向前填充即可完成,无需移除行:
import pandas as pd # 假设数据存储在df中 # 第一步:仅保留top_tier非空行的region值,其余设为NaN df['result'] = df['region'].where(df['top_tier'].notna()) # 第二步:向前填充NaN值,获取最近的上级区域 df['result'] = df['result'].ffill() # 第三步:将top_tier非空行的result重置为空 df['result'] = df['result'].where(df['top_tier'].isna(), '')
逻辑说明
df['region'].where(df['top_tier'].notna()):筛选出top_tier非空行的区域值,其他行转为空值ffill():把空值替换为上一个非空的区域值,也就是对应的上级区域- 最后一步的
where操作:将top_tier非空行的result清空,完全匹配需求
内容的提问来源于stack exchange,提问作者elksie5000
相关产品推荐
相关产品推荐

