如何通过检查另一列来填充列的 na 值

How to fill na values of a column by checking another column

这张图片会更有帮助:

passengerId一栏描述了组号和人数,同一组的人通常是一家人,因此他们来自同一个星球。所以它们是 Home planet 列中的一些 nan 行,我想通过有关 PassengerID 列中的组号的知识来填充它。

所以我需要一个代码或者可能是一个循环,通过检查它们是否与某人在一个组中来填充 Home planet 列中的 na 值(因为它们因此可能在同一个 homeplanet 中,因为它们很可能一个家族) 。这基本上就是我需要的帮助,通过检查组号并使用关于组成员的 Homeplanet 作为 na 值的替换来填充 Homeplanet 列中的 na 值

我试过 运行 for 循环,但我什至不知道要指定什么参数。我将 PassengerId 转换为一个数组,与 Homeplanet 相同,并尝试通过成员转换为其他数组,但我不知道如何前进。

如果我对描述的理解正确,这个示例数据框将展示问题:

df = pd.DataFrame({'passenger_id': ['1', '1', '2', '2'], 'home_planet': ['3', np.nan, '4', np.nan]})
df

   passenger_id | home_planet
0 | 1           |  3
1 | 1           |  NaN
2 | 2           |  4
3 | 2           |  NaN

根据 passenger_id 列中的值,您希望 NaN 值为 3 和 4。

您可以通过将 DataFrame 与其经过清理和去重的自身合并来做到这一点:

pd.merge(df, df.loc[df['home_planet'].notna()].drop_duplicates(), 
on='passenger_id', suffixes=('_x', ''))[['passenger_id', 'home_planet']]


   passenger_id | home_planet
0 | 1           |  3
1 | 1           |  3
2 | 2           |  4
3 | 2           |  4

问题更新后更新

您可以从 PassengerId 中提取一个 GroupId 字段,然后按照我最初的建议进行操作:

df = pd.DataFrame({'PassengerId': ['9280_01', '9280_02', '9279_01', '9279_02'], 
'HomePlanet': ['Europa', np.nan, 'Earth', np.nan]})
df

  PassengerId HomePlanet
0     9280_01     Europa
1     9280_02        NaN
2     9279_01      Earth
3     9279_02        NaN

df['GroupId'] = df['PassengerId'].apply(lambda x: x.split('_')[0])
df

  PassengerId HomePlanet GroupId
0     9280_01     Europa    9280
1     9280_02        NaN    9280
2     9279_01      Earth    9279
3     9279_02        NaN    9279

pd.merge(df, df.loc[df['HomePlanet'].notna()].drop_duplicates(), 
on='GroupId', suffixes=('_x', ''))[['PassengerId', 'HomePlanet']]

  PassengerId HomePlanet
0     9280_01     Europa
1     9280_01     Europa
2     9279_01      Earth
3     9279_01      Earth

如果您想进一步检查以确定这两名乘客是否确实来自同一家庭(例如检查他们的名字),您可以在 apply.

中执行此操作