如何根据熊猫中组合的最高出现次数来填充值?

时间:2018-12-10 07:37:03

标签: python pandas numpy

我有一个巨大的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

2 个答案:

答案 0 :(得分:2)

一种简单的解决方案,使用n = 30根据import math def f(listsofar, numbersleft): if not numbersleft: return listsofar result = False for i in numbersleft: if not listsofar or math.sqrt(listsofar[-1] + i).is_integer(): result = f(listsofar + [i], [j for j in numbersleft if j != i]) if result: break return result n = int(input("Arrange numbers from 1 to ").strip()) numbers = list(range(1, n+1)) print("Input:", numbers) print("Output:", f([], numbers)) collections.Counter字段查找最常见的Country

'**unknown**'

答案 1 :(得分:2)

您可以将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