将字典映射到 Panda 中一列的 NAN 行

Mapping a dictionary to NAN rows of a column in Panda

如下所示是一个数据框,其中一列 col2 中有许多 nan,我只想将 col1 的 nan 值填充为字典中的键 dict_map 并将这些值映射到 col2.

可重现代码:

    import pandas as pd
    import numpy as np
    dict_map = {'a':45,'b':23,'c':97,'z': -1}
    df =  pd.DataFrame()
    df['tag'] = [1,2,3,4,5,6,7,8,9,10,11]
    df['col1'] = ['a','b','c','b','a','a','z','c','b','c','b']
    df['col2'] = [np.nan,909,34,56,np.nan,45,np.nan,11,61,np.nan,np.nan]
    df['_'] = df['col1'].map(dict_map)

    

预期输出

方法之一是:

df['col3'] =  np.where(df['col2'].isna(),df['_'],df['col2'])
df  

只是想知道使用函数和映射函数的任何其他方法,我们可以优化它。

您可以将 col1 映射到 dict_map,然后将其用作 fillna 的输入,如下所示

df['col3'] = df['col2'].fillna(df['col1'].map(dict_map))

您只需使用 list comprehension 即可获得完全相同的结果,这是一个非常 pythonic 的解决方案,我相信它具有更好的性能。

我们正在读取 col2 并将值复制到 col3(如果不是 NaN)。然后,如果是,我们查看 Col1,获取 dict key,然后使用 dict_map.

中的相应值
df['col3'] = [df['col2'][idx] if not np.isnan(df['col2'][idx]) else dict_map[df['col1'][idx]] for idx in df.index.tolist()]

输出:

df

   tag  col1     col2    col3
 0   1     a      NaN    45.0
 1   2     b    909.0   909.0
 2   3     c     34.0    34.0
 3   4     b     56.0    56.0
 4   5     a      NaN    45.0
 5   6     a     45.0    45.0
 6   7     z      NaN    -1.0
 7   8     c     11.0    11.0
 8   9     b     61.0    61.0
 9  10     c      NaN    97.0
10  11     b      NaN    23.0