如何使用每个组中出现最频繁的值来填充DataFrame中的缺失值?

4

我有一个带有两列的pandas DataFrame: toycolor。其中 color 列中存在缺失值。

如何使用特定 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替换为blue,因为这是汽车最常见的颜色。
  • 将第二个和第三个NaN替换为red,因为这是火车最常见的颜色。
  • 将第四个NaN替换为blue或red,因为它们在球的最常见颜色中并列第一。

关于真实数据集的注意事项:

  • 有许多不同的玩具类型(不仅仅是四种)。
  • 没有只有对于“颜色”有缺失值的“玩具”类型,因此答案不需要处理该情况。

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

2个回答

3
您可以使用groupby()+transform()+fillna()来实现:
df['color']=df['color'].fillna(df.groupby('toy')['color'].transform(lambda x:x.mode().iat[0]))

如果在有两个或多个频繁值时想要随机选择数值:

from random import choice

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

2
抢先一步了,+1 ;) - mozway
这难道不是用每个玩具最常见的颜色替换所有颜色吗?也就是说,每辆车的颜色都被替换成了蓝色。 - norie
@norie 哦..是的,已经更正了...谢谢你注意到了 :) - Anurag Dabas

2
你想用众数填充数据,可以使用fillna函数:
df["color"] = df.groupby("toy")["color"].apply(lambda x: x.fillna(x.mode().iat[0]))

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