填充NaN时遇到一些麻烦。我想获取一个带有几个NaN的数据帧列,并用一个来自查找表的值填充它们'基于另一列的值。 (您可能会从泰坦尼克号数据集中识别出我的数据)......
Pclass Age
0 1 33
1 3 24
2 1 23
3 2 NaN
4 1 Nan
我想用系列中的值填充NaN' pclass_lookup':
pclass_lookup
1 38.1
2 29.4
3 25.2
我尝试使用索引编写fillna,如:
df.Age.fillna(pclass_lookup[df.Pclass]), but it gives me an error of
ValueError: cannot reindex from a duplicate axis
lambdas也是一个尝试:
df.Age.map(lambda x: x if x else pclass_lookup[df.Pclass]
但是,这似乎也没有填补它。我在这里完全错过了这条船吗? '
答案 0 :(得分:4)
首先你对第4行有一个duff值,你实际上有一个字符串' Nan'这与NaN'不同。因此,即使您的代码确实有效,也不会替换此值。
所以你需要替换那个duff值,然后你可以调用map来对NaN
值执行查找:
In [317]:
df.Age.replace('Nan', np.NaN, inplace=True)
df.loc[df['Age'].isnull(),'Age'] = df['Pclass'].map(df1.pclass_lookup)
df
Out[317]:
Pclass Age
0 1 33
1 3 24
2 1 23
3 2 29.4
4 1 38.1
<强>计时强>
对于5000行的df:
In [26]:
%timeit df.loc[df['Age'].isnull(),'Age'] = df['Pclass'].map(df1.pclass_lookup)
100 loops, best of 3: 2.41 ms per loop
In [27]:
%%timeit
def remove_na(x):
if pd.isnull(x['Age']):
return df1[x['Pclass']]
else:
return x['Age']
df['Age'] =df.apply(remove_na, axis=1)
1 loops, best of 3: 278 ms per loop
In [28]:
%%timeit
nulls = df.loc[df.Age.isnull(), 'Pclass']
df.loc[df.Age.isnull(), 'Age'] = df1.loc[nulls].values
100 loops, best of 3: 3.37 ms per loop
所以你看到这里适用,因为与其他两个被矢量化的方法相比,迭代行的比例很差,但map
仍然是最快的。
答案 1 :(得分:1)
以@ vrajs5的响应为基础:
# Create dummy data
df = pd.DataFrame()
df['Pclass'] = [1,3,1,2,1]
df['Age'] = [33,24,23,None, None]
pclass_lookup = pd.Series([38.1,29.4,25.2], index = range(1,4))
# Solution:
nulls = df.loc[df.Age.isnull(), 'Pclass']
df.loc[df.Age.isnull(), 'Age'] = pclass_lookup.loc[nulls].values
>>> df
Pclass Age
0 1 33.0
1 3 24.0
2 1 23.0
3 2 29.4
4 1 38.1
答案 2 :(得分:0)
以下应该适合你:
df = pd.DataFrame()
df['Pclass'] = [1,3,1,2,1]
df['Age'] = [33,24,23,None, None]
df
Pclass Age
0 1 33
1 3 24
2 1 23
3 2 NaN
4 1 NaN
pclass_lookup = pd.Series([38.1,29.4,25.2], index = range(1,4))
pclass_lookup
1 38.1
2 29.4
3 25.2
dtype: float64
def remove_na(x):
if pd.isnull(x['Age']):
return pclass_lookup[x['Pclass']]
else:
return x['Age']
df['Age'] =df.apply(remove_na, axis=1)
Pclass Age
0 1 33.0
1 3 24.0
2 1 23.0
3 2 29.4
4 1 38.1