如果���常见值存在,则使用最常见值进行Fillna;否则,使用整列的最常见值进行Fillna。

5
我有一个Panda数据框。
        City    State
0    Cambridge    MA
1          NaN    DC
2       Boston    MA
3   Washignton    DC
4          NaN    MA
5        Tampa    FL
6      Danvers    MA
7        Miami    FL
8    Cambridge    MA
9        Miami    FL
10         NaN    FL
11  Washington    DC

我希望根据最常见的状态填充NaN值,如果该状态之前出现过,则按照状态分组并应用以下代码:
df['City'] = df.groupby('State').transform(lambda x:x.fillna(x.value_counts().idxmax()))

以上代码适用于如果所有状态都发生了,输出结果将是:
          City State
0    Cambridge    MA
1   Washignton    DC
2       Boston    MA
3   Washignton    DC
4    Cambridge    MA
5        Tampa    FL
6      Danvers    MA
7        Miami    FL
8    Cambridge    MA
9        Miami    FL
10       Miami    FL
11  Washington    DC

然而,我希望添加一个条件,即如果某个州从未出现过,则该州的城市将是整个“城市”列中最常见的城市。例如,如果数据框如下:

          City State
0    Cambridge    MA
1          NaN    DC
2       Boston    MA
3   Washignton    DC
4          NaN    MA
5        Tampa    FL
6      Danvers    MA
7        Miami    FL
8    Cambridge    MA
9        Miami    FL
10         NaN    FL
11  Washington    DC
12         NaN    NY 

NY从未出现过,我希望输出结果为:

          City State
0    Cambridge    MA
1   Washignton    DC
2       Boston    MA
3   Washignton    DC
4    Cambridge    MA
5        Tampa    FL
6      Danvers    MA
7        Miami    FL
8    Cambridge    MA
9        Miami    FL
10       Miami    FL
11  Washington    DC
12   Cambridge    NY 

以上代码出现 ValueError: ('尝试获取空序列的argmax'),因为“NY”从未出现过。

2个回答

3

IIUC:

def f(x):
    if x.count()<=0:
        return np.nan
    return x.value_counts().index[0]

df['City'] = df.groupby('State')['City'].transform(f)

df['City'] = df['City'].fillna(df['City'].value_counts().idxmax())

输出:

          City State
0    Cambridge    MA
1   Washignton    DC
2    Cambridge    MA
3   Washignton    DC
4    Cambridge    MA
5        Miami    FL
6    Cambridge    MA
7        Miami    FL
8    Cambridge    MA
9        Miami    FL
10       Miami    FL
11  Washignton    DC
12   Cambridge    NY

@AyaAbdelsalam,这个答案对你有帮助吗? - Scott Boston

0
您可以通过以下代码解决此问题。
mode =  df['City'].mode()[0]
df['City'] = df.groupby('State')['City'].apply(lambda x: x.fillna(x.value_counts().idxmax() if x.value_counts().max() >=1 else mode , inplace = False))
df['City']= df['City'].fillna(df['City'].value_counts().idxmax())

输出:

          City State
0    Cambridge    MA
1   Washignton    DC
2       Boston    MA
3   Washignton    DC
4    Cambridge    MA
5        Tampa    FL
6      Danvers    MA
7        Miami    FL
8    Cambridge    MA
9        Miami    FL
10       Miami    FL
11  Washington    DC
12   Cambridge    NY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接