如何将R中填充缺失ID为递增序列的代码转写为Pandas实现
错误原因
你写的代码报错是因为if x.isnull()的判断逻辑不成立:x.isnull()返回的是整个列的布尔序列,不是单个布尔值,无法直接用于标量判断。
正确实现
可以用np.where完全对齐R中ifelse的逻辑,实现效果和原R代码完全一致:
import numpy as np df = df.assign(id = lambda x: np.where( x['id'].isna(), x['id'].isna().cumsum(), x['id'] ))
如果不想额外引入numpy依赖,也可以直接用pandas自带的where方法:
df = df.assign(id = lambda x: x['id'].where( x['id'].notna(), x['id'].isna().cumsum() ))
逻辑说明
x['id'].isna():判断id列的空值,对应R的is.na(id)x['id'].isna().cumsum():对空值布尔序列累加计数(布尔值True会被视为1、False视为0),每遇到一个空值计数就加1,刚好给所有空ID分配从1开始递增的唯一值,对应R的cumsum(is.na(id))- 非空的ID值会保持原值不变
内容的提问来源于stack exchange,提问作者Maverick Meerkat
相关产品推荐
相关产品推荐

