我想用NaN列中的下一个值填充值:numberdf Id Date is_start number151256 30 2010-09-21 False NaN237558 30 2010-09-22 False 0.036922 120 2010-10-13 False 0.0246284 80 2010-09-21 False NaN47655 80 2010-09-21 False 658.0可重现的例子:import pandas as pdimport numpy as npimport datetimesample_df = pd.DataFrame({'Id': {151256: 30, 237558: 30, 36922: 120, 246284: 80, 47655: 80}, 'Date': {151256: datetime.date(2010, 9, 21), 237558: datetime.date(2010, 9, 22), 36922: datetime.date(2010, 10, 13), 246284: datetime.date(2010, 9, 21), 47655: datetime.date(2010, 9, 21)}, 'is_start': {151256: False, 237558: False, 36922: False, 246284: False, 47655: False}, 'number': {151256: np.nan, 237558: 0.0, 36922: 0.0, 246284: np.nan, 47655: 658.0}})sample_df预期输出: Id Date is_start number151256 30 2010-09-21 False 0.0 (replaced)237558 30 2010-09-22 False 0.036922 120 2010-10-13 False 0.0246284 80 2010-09-21 False 658.0 (replaced)47655 80 2010-09-21 False 658.0我试过:sample_df['number'] = sample_df.fillna(sample_df.number.shift())但得到输出: Id Date is_start number151256 30 2010-09-21 False 30237558 30 2010-09-22 False 3036922 120 2010-10-13 False 120246284 80 2010-09-21 False 8047655 80 2010-09-21 False 80其中number采用Id列中的值。为什么会发生这种情况以及正确的方法是什么?
2 回答
一只名叫tom的猫
TA贡献1906条经验 获得超3个赞
这里检查bfill注意限制是只填充下一个NaN值
df.number = df.number.bfill(limit=1)
Out[138]:
151256 0.0
237558 0.0
36922 0.0
246284 658.0
47655 658.0
Name: number, dtype: float64
至尊宝的传说
TA贡献1789条经验 获得超10个赞
BEN_YO 的解决方案就是答案,但这里有一个使用fillnaand的替代方案shift(-1):
sample_df['number'] = sample_df['number'].fillna(sample_df['number'].shift(-1))
sample_df
Out[1]:
Id Date is_start number
151256 30 2010-09-21 False 0.0
237558 30 2010-09-22 False 0.0
36922 120 2010-10-13 False 0.0
246284 80 2010-09-21 False 658.0
47655 80 2010-09-21 False 658.0
添加回答
举报
0/150
提交
取消