У меня есть огромный DF, который выглядит примерно так -
... || City || Country
Newyork USA
Newyork USA
Newyork USA
Newyork **unknown**
delhi india
delhi **unknown**
delhi india
Теперь я хочу заполнить неизвестных правильной страной, основываясь на том, какие города уже были сопоставлены. Например, большинство строк с символом Нью-Йорк были столбцом США в стране.
Моя идея состояла в том, чтобы сгруппировать по странам и преобразовать их в словарь для сопоставления, но это не помогло.
Здесь задан аналогичный вопрос, но решение в R: заполнить пропущенное значение на основе вероятности возникновения
Вы можете использовать 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
Простое решение с использованием 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