我想用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
提交
取消