如何用每组中最频繁的值填充DataFrame中缺失的值



我有一个pandas DataFrame,它有两列:toycolorcolor列包含缺少的值。

如何用该特定toy的最频繁color填充缺失的color值?

以下是创建示例数据集的代码:

import pandas as pd
import numpy as np
df = pd.DataFrame({
'toy':['car'] * 4 + ['train'] * 5 + ['ball'] * 3 + ['truck'],
'color':['red', 'blue', 'blue', np.nan, 'green', np.nan,
'red', 'red', np.nan, 'blue', 'red', np.nan, 'green']
})

以下是示例数据集:

toy  color
0     car    red
1     car   blue
2     car   blue
3     car    NaN
4   train  green
5   train    NaN
6   train    red
7   train    red
8   train    NaN
9    ball   blue
10   ball    red
11   ball    NaN
12  truck  green

这是想要的结果:

  • 第一个NaN替换为蓝色,因为这是汽车最常见的color
  • 第二个和第三个NaNs替换为红色,因为这是列车最频繁的color
  • 第四个NaN替换为蓝色或红色,因为它们并列为球最频繁的color

关于真实数据集的说明:

  • 有许多不同的toy类型(不仅仅是四种)
  • 没有toy类型只缺少color的值,因此答案不需要处理这种情况

这个问题是相关的,但它没有回答我的问题,即如何使用最频繁的值来填充缺失的值。

您可以使用groupby()+transform()+fillna():

df['color']=df['color'].fillna(df.groupby('toy')['color'].transform(lambda x:x.mode().iat[0]))

如果要在有2个或更多频繁值时选择随机值:

from random import choice
df['color']=df['color'].fillna(df.groupby('toy')['color'].transform(lambda x:choice(x.mode())))

您想要使用mode:进行fillna

df["color"] = df.groupby("toy")["color"].apply(lambda x: x.fillna(x.mode().iat[0]))

最新更新