如何用每组中出现频率最高的值填充DataFrame中缺失的值?

2022-09-02 00:00:00 python pandas dataframe missing-data

问题描述

我有一个包含两列的 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
  • 将第二个和第三个NaN替换为红色,因为这是列车中最常见的color
  • 将第四个NaN替换为蓝色或红色,因为它们是并列的color

真实数据集备注:

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

This question是相关的,但它没有回答我如何使用最频繁的值来填充缺少的值的问题。


解决方案

可以使用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())))

相关文章