Python 填写表中缺失值的推荐方法

Python 填写表中缺失值的推荐方法,python,pandas,Python,Pandas,使用pandas,我想用列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

使用pandas,我想用列
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)
所有这些都会导致相同的结果。有推荐的方法吗

谢谢。

然后我们进行计时:

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
然后我们做计时:

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

另一种选择是将熊猫与:


另一种选择是将熊猫与:


它们都有优点和缺点。什么对你最有用?我认为这不是一个有用的问题。第二个(第三个)让我有点困惑,因为它在正确的数据帧上获得了正确的索引,而第一个是显式的。第三个应该是自解释的。您正在使用设计用于解决此问题的API。第一,熊猫会自动排列索引,这就是熊猫令人敬畏的原因之一。第二,你正在为大熊猫做这项工作,因为你消除了它本来要处理的指数。谢谢你的澄清。我理解,对于第三种解决方案,它是在幕后处理的。至于第一个,实际上,我是在选择
b
a
中的相关行时完成这项工作的。事实上,对我来说不那么“直截了当”的是第二个。由于可以用另一个系列(独立于df1)替换
df1.a
,我发现pandas将右行索引从等式的左侧“传播”到右侧,这有点令人着迷。对于第二个,如果传递列表或数组,它的大小必须相同。如果你这样做,它会根据顺序排列。如果使用序列,则它有一个用于查找值的索引。如果缺少一个索引,您会发现它们各有优缺点。什么对你最有用?我认为这不是一个有用的问题。第二个(第三个)让我有点困惑,因为它在正确的数据帧上获得了正确的索引,而第一个是显式的。第三个应该是自解释的。您正在使用设计用于解决此问题的API。第一,熊猫会自动排列索引,这就是熊猫令人敬畏的原因之一。第二,你正在为大熊猫做这项工作,因为你消除了它本来要处理的指数。谢谢你的澄清。我理解,对于第三种解决方案,它是在幕后处理的。至于第一个,实际上,我是在选择
b
a
中的相关行时完成这项工作的。事实上,对我来说不那么“直截了当”的是第二个。由于可以用另一个系列(独立于df1)替换
df1.a
,我发现pandas将右行索引从等式的左侧“传播”到右侧,这有点令人着迷。对于第二个,如果传递列表或数组,它的大小必须相同。如果你这样做,它会根据顺序排列。如果使用序列,则它有一个用于查找值的索引。如果一个索引丢失,您将得到另一个,
df1.b=df1.b.fillna(df1.a)
df1.b.fillna(df1.a,inplace=True)
?另一个,
df1.b=df1.b.fillna(df1.a)
df1.b.fillna(df1.a,inplace=True)