Как заполнить значения, основанные на наибольшем количестве комбинаций в пандах?

1

У меня есть огромный DF, который выглядит примерно так -

...   ||    City     ||  Country
           Newyork        USA
           Newyork        USA
           Newyork        USA
           Newyork        **unknown**
           delhi          india
           delhi          **unknown**
           delhi          india

Теперь я хочу заполнить неизвестных правильной страной, основываясь на том, какие города уже были сопоставлены. Например, большинство строк с символом Нью-Йорк были столбцом США в стране.

Моя идея состояла в том, чтобы сгруппировать по странам и преобразовать их в словарь для сопоставления, но это не помогло.

Здесь задан аналогичный вопрос, но решение в R: заполнить пропущенное значение на основе вероятности возникновения

Теги:
pandas
numpy

2 ответа

1

Вы можете использовать value_counts с первым индексом или первым значением mode для групп с replace:

def f(x):
    #remove '**unknown**' rows and get top1 value
    return x.replace('**unknown**', x[x.ne('**unknown**')].value_counts().index[0])
    #return x.replace('**unknown**', x[x.ne('**unknown**')].mode().iat[0])

df['Country'] = df.groupby('City')['Country'].apply(f)
print (df)
      City Country
0  Newyork     USA
1  Newyork     USA
2  Newyork     USA
3  Newyork     USA
4    delhi   india
5    delhi   india
6    delhi   india

Другое решение - заменить **unknown** на пропущенные значения, получить верхнее значение и fillna:

df['Country'] = df['Country'].replace('**unknown**', np.nan)

s = df.groupby('City')['Country'].transform(lambda x: x.value_counts().index[0])
#alternative
#s = df.groupby('City')['Country'].transform(lambda x: x.mode().iat[0])
df['Country'] = df['Country'].fillna(s)
print (df)
      City Country
0  Newyork     USA
1  Newyork     USA
2  Newyork     USA
3  Newyork     USA
4    delhi   india
5    delhi   india
6    delhi   india
1

Простое решение с использованием collections.Counter для поиска наиболее распространенной Country для полей '**unknown**' основанной на groupby('City').

from collections import Counter
def MC(a):
    return a.replace('**unknown**', Counter(a).most_common()[0][0])

df.Country = df.groupby('City').Country.apply(MC)
print(df)

#      City Country
# 0  Newyork     USA
# 1  Newyork     USA
# 2  Newyork     USA
# 3  Newyork     USA
# 4    delhi   india
# 5    delhi   india
# 6    delhi   india

Ещё вопросы

Сообщество Overcoder
Наверх
Меню