我有一个很大的df,看起来像这样-

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

现在,我想根据已经匹配的城市,用正确的国家来填写未知数。例如,与纽约的大多数行都是美国的“国家”列。
我的想法是按国家分组,并将其转换成一本字典来绘制地图,但这种做法失败了。
下面是一个类似的问题,但答案是R:
Fill missing value based on probability of occurrence

最佳答案

您可以使用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

10-06 08:24