微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 带有查找表的Pandas fillna

在填充NaN时遇到一些麻烦.我想获取一个带有几个NaN的数据帧列,并使用基于另一列的值从“查找表”派生的值填充它们.
    (您可能会从泰坦尼克号数据集中识别出我的数据)……

    Pclass   Age
0   1        33
1   3        24
2   1        23
3   2        NaN
4   1        Nan

我想用系列’pclass_lookup’中的值填充NaN:

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]

但是,这似乎也没有填补它.我在这里完全错过了这条船吗? “

解决方法:

首先你有第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

所以你看到这里适用,因为与其他两个被矢量化的方法相比,迭代行方式比较差,但是地图仍然是最快的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐