按一列分组,获取另一列的模式,并用该特定模式填充 na

问题描述 投票:0回答:1

我正在 Kaggle 上使用 SpaceShipTitanic 数据集。

我有一个df。我想按列分组,根据该组查找第二列的众数,并用最常见的值填充该第二列中组中的所有 np.NaN 值。

我觉得我在回避这个问题而没有找到答案。

我尝试过 .mask 和 .transform 和 .agg。我已经使用了 lambda 函数并尝试处理索引,但我没有实现我想要的。我一定没有正确地将零件组装在一起

这是一个简短的例子。 从这样的事情开始。

df = 
         Passenger_Group    HomePlanet
1        1                  Earth
2        1                  Mars
3        1                  Earth
4        1                  NaN
5        2                  NaN
6        2                  Venus
7        3                  Ceres

请注意,在完整的数据集中有更多的列和行,因此我必须解决其他列名称。 我们的目标是最终得到一个看起来像这样的 df

df = 
         Passenger_Group    HomePlanet
1        1                  Earth
2        1                  Mars
3        1                  Earth
4        1                  Earth
5        2                  Venus
6        2                  Venus
7        3                  Ceres

我觉得这应该是一个简单的命令。但我尝试的一切都不太有效。

什么是简洁的Python方式来做到这一点?

python pandas group-by fillna
1个回答
0
投票

有一个干净的解决方案,使用 pandas 用每个组的众数填充 NaN 值:

数据处理.py

df['HomePlanet'] = df.groupby('Passenger_Group')['HomePlanet'].transform(lambda x: x.fillna(x.mode().iloc[0]))

这一行:

  1. 按 Passenger_Group 对数据进行分组
  2. 对于每个组,找到 HomePlanet 的众数
  3. 用该模式填充 NaN 值
  4. 返回与原始数据框对齐的系列

如果您更喜欢更明确的方法:

# Calculate modes for each group
modes = df.groupby('Passenger_Group')['HomePlanet'].agg(lambda x: x.mode().iloc[0])

# Fill NaN values using the calculated modes
df['HomePlanet'] = df['HomePlanet'].fillna(df['Passenger_Group'].map(modes))

这两种方法都会给您带来想要的结果。第一个选项更简洁,而第二个选项使步骤更清晰。

© www.soinside.com 2019 - 2024. All rights reserved.