当与另一个数据框列中的列表项匹配时,更新数据框中的NaN值

时间:2020-04-10 11:18:59

标签: pandas dataframe nan

Python的入门者。 试图从众多站点中寻找解决方案。 可能只是没有正确地连接点。

我正在尝试基于列表中存在的值在DataFrame中填充“ NaN”值。 如果人员名称出现在列表中,则“ geo”列应使用正确的地理名称进行更新。 列表是完整的,区域中有人员,但是DataFrame不是,需要更新。

我所拥有的大致如下:

   name  geo 
0  john  EMEA
1  jack  NaN
2  jill  APAC
3  james NaN 
4  judy  EMEA
5  jared NaN

我想根据以下列表更新NaN值。

EMEA = ['john','jack','judy','jared']
APAC = ['jill','james']

3 个答案:

答案 0 :(得分:1)

首先按每个列表创建字典:

EMEA = ['john','jack','judy','jared']
APAC = ['jill','james']

d = {'EMEA' : EMEA,
     'APAC': APAC}

然后将交换订单展平:

d1 = {x: k for k, v in d.items() for x in v}
print (d1)
{'john': 'EMEA', 'jack': 'EMEA', 'judy': 'EMEA',
 'jared': 'EMEA', 'jill': 'APAC', 'james': 'APAC'}

最后仅用Series.mapSeries.fillna的映射值替换misisng值:

df['geo'] = df['geo'].fillna(df['name'].map(d1))
print (df)
    name   geo
0   john  EMEA
1   jack  EMEA
2   jill  APAC
3  james  APAC
4   judy  EMEA
5  jared  EMEA

或映射所有值:

df['geo'] = df['name'].map(d1)
print (df)
    name   geo
0   john  EMEA
1   jack  EMEA
2   jill  APAC
3  james  APAC
4   judy  EMEA
5  jared  EMEA

答案 1 :(得分:0)

一个简单的np.where应该可以解决此问题: https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html

df['geo'] = np.where((df['geo'].isnull()) & (df['name'].isin(MEA)), 'MEA',
            np.where((df['geo'].isnull()) & (df['name'].isin(APAC)), 'APAC',
                      pdf['geo']))

答案 2 :(得分:0)

尝试一下:

for x in df.index:
    if df.loc[x,"name"] in EMEA:
        df.loc[x,"geo"]='EMEA'
    if df.loc[x,"name"] in APAC:
        df.loc[x,"geo"]="APAC"

希望这会有所帮助。祝你好运!