Обновление значений NaN в фрейме данных при совпадении с элементом списка в другом столбце фрейма данных - PullRequest
0 голосов
/ 10 апреля 2020

новичок в Python здесь. Пытался найти решение для этого с кучей сайтов. Может быть, не правильно соединять точки.

Я пытаюсь заполнить значения 'NaN' в DataFrame на основе значений, присутствующих в списке. Если имя человека появляется в списке, столбец «гео» должен быть обновлен с правильным именем гео. Списки полны, с людьми в регионах, но 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 ]

1 голос
/ 10 апреля 2020

Сначала создайте словарь по каждому списку:

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.map и Series.fillna:

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
0 голосов
/ 10 апреля 2020

Попробуйте:

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"

Надеюсь, это поможет. Удачи!

0 голосов
/ 10 апреля 2020

Простой 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']))
...