如何将DataFrame中的null值替换为连续递增的序列编号?
你写的代码不生效有两个原因:
- 采用了链式索引
df_1['val'][df_1['val'].isnull()]的方式赋值,会触发pandas的SettingWithCopyWarning,不会实际修改原DataFrame,正确赋值应该用.loc索引 - 逻辑不符合需求:对空值切片做
ffill()得到的还是空值,直接加全量空值计数的逻辑也无法实现「非空值后的空值按顺序递增计数」的效果
正确实现方案
你需要先对val列的非空值做分组,每遇到一个非空值就开启新分组,每个分组内的空值直接用组内序号填充即可,示例代码如下:
首先构造测试数据:
import pandas as pd import numpy as np df = pd.DataFrame({ 'id': [1,2,3,4,5], 'val': [40, np.nan, np.nan, 30, np.nan] })
一行代码即可实现需求:
df['val'] = df['val'].fillna(df.groupby(df['val'].notna().cumsum()).cumcount() + 1)
运行后df的输出结果与要求一致:
id val 0 1 40.0 1 2 1.0 2 3 2.0 3 4 30.0 4 5 3.0
如果需要val列为整数类型,可以额外执行df['val'] = df['val'].astype(int)做类型转换。
内容的提问来源于stack exchange,提问作者user458
相关产品推荐
相关产品推荐

