将字典映射到 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
如下所示是一个数据框,其中一列 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