[英]Individually replace NaN in pandas.dataframe
我有一個900 x 7數據框,其中3個字段包含一些NaN值。
我創建了一個函數,使用一種算法根據該行中的其他值來估計每個NaN的可能值,而不是簡單地用某個特征平均值替換這些值。
如何使用自定義函數遍歷每個NaN來更改其值?
我的函數使用行ID,其他要素名稱以及包含NaN的要素作為參數。
例如
custom_fillnan(id=0, ins=["val0", "val1", "val2"], out="valn")
示例數據框:
ID val0 val1 val2 ... valn
0 1 2 3 ... NaN
1 1 NaN 3 ... 4
2 0 0 NaN ... 1
...
您可以apply
IIUC與axis=1
一起apply
,並將fillna
與自定義函數一起使用:
In [80]: df
Out[80]:
ID val0 val1 val2 valn
0 0 1 2 3 NaN
1 1 1 NaN 3 4
2 2 0 0 NaN 1
In [83]: df.apply(lambda x: x.fillna(pd.np.mean(x.iloc[1:])), axis=1)
Out[83]:
ID val0 val1 val2 valn
0 0 1 2.000000 3.000000 2
1 1 1 2.666667 3.000000 4
2 2 0 0.000000 0.333333 1
可以使用函數代替pd.np.mean
。 x.iloc[1:]
是因為據我了解,您只想將val
列用於函數。
編輯
如果要獲取缺少值的列名,可以應用或使用該函數進行處理:
def func(x):
x.loc[x.isnull()] = x.index[x.isnull()]
return x
In [209]: df.apply(func, axis=1)
Out[209]:
ID val0 val1 val2 valn
0 0 1 2 3 valn
1 1 1 val1 3 4
2 2 0 0 val2 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.