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