2017-09-19 45 views
0

使用熊猫填充缺失值推荐的方法,我想从以下数据框中df1与列中的值填写b列的缺失值a对大熊猫

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame(data=dict(a=[1, 2, 3], b=[1, np.nan, 3])) 
mask = pd.isnull(df1.b) 

看来我可以使用三种不同的方式:

# first 
df1.loc[mask, 'b'] = df1.loc[mask, 'a'] 
#second 
df1.loc[mask, 'b'] = df1.a 
# third 
df1.fillna(value=dict(b=df1.a), inplace=True) 

所有这些都导致相同的结果。有推荐的方法吗?

谢谢。

+0

他们都有优点和缺点。什么对你最有用? – piRSquared

+0

我认为这不是一个有用的问题。我对第二个(也是第三个)有点困惑,因为它在正确的DataFrame上获得适当的索引,而在第一种情况下它是明确的。 –

+0

第三个应该是自我解释。您正在使用旨在解决此问题的API。一,熊猫自动对齐指数,这就是大熊猫真棒的原因之一。二,你正在为熊猫做的工作,通过消除它将要照顾的指数。 – piRSquared

回答

2

然后我们做的时间:

import pandas as pd 
import numpy as np 
df1 = pd.DataFrame(data=dict(a=[1, 2, 3], b=[1, np.nan, 3])) 
mask = pd.isnull(df1.b) 
%timeit df1.loc[mask, 'b'] = df1.loc[mask, 'a'] 
1000 loops, best of 3: 1.15 ms per loop 
%timeit df1.loc[mask, 'b'] = df1.a 
1000 loops, best of 3: 1.16 ms per loop 
%timeit df1.fillna(value=dict(b=df1.a), inplace=True) 
1000 loops, best of 3: 215 µs per loop 

#3rd one is the fastest among three. 

编辑方法从@Zero

%timeit df1.b = df1.b.fillna(df1.a) 
1000 loops, best of 3: 371 µs per loop 
%timeit df1.b.fillna(df1.a, inplace=True) 
1000 loops, best of 3: 210 µs per loop 
+0

另一个'df1.b = df1.b.fillna(df1.a)'或'df1.b.fillna(df1.a,inplace = True)'? – Zero

0

另一种方法是使用大熊猫where()有:

df1["b"].where(df1["b"]==np.nan, other=df1["a"],inplace=True) 

print(df1) 

    a b 
0 1 1.0 
1 2 2.0 
2 3 3.0