如何通过检查另一列来填充列的 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
.
中执行此操作
这张图片会更有帮助:
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
.