
[英]Python/Pandas: if value is NaN or 0 then fill with the value from the next column within the same row
[英]Fill NaN values with next value in same column in Python
我想用df
列number
的下一个值填充NaN
值:
Id Date is_start number
151256 30 2010-09-21 False NaN
237558 30 2010-09-22 False 0.0
36922 120 2010-10-13 False 0.0
246284 80 2010-09-21 False NaN
47655 80 2010-09-21 False 658.0
可重现的例子:
import pandas as pd
import numpy as np
import datetime
sample_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 number
151256 30 2010-09-21 False 0.0 (replaced)
237558 30 2010-09-22 False 0.0
36922 120 2010-10-13 False 0.0
246284 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 number
151256 30 2010-09-21 False 30
237558 30 2010-09-22 False 30
36922 120 2010-10-13 False 120
246284 80 2010-09-21 False 80
47655 80 2010-09-21 False 80
其中number
在Id
列中取值。 为什么会发生这种情况,正确的方法是什么?
这里检查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
BEN_YO 的解决方案就是答案,但这里有一个带有fillna
和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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.