Pandas 条件筛选dataframe
问题描述
我正在尝试筛选一个数据框,但是我不知道如何筛选到我真正想要的值。我真的不知道如何解释我想做什么(这让搜索变得真正痛苦),因此下面是一个示例代码片段:
race driver team ...
1 Alonso Ferrari
1 Massa Ferrari
1 Hamilton McLaren
...
2 Alonso McLaren
2 Hamilton McLaren
2 Massa Ferrari
...
我想要的是根据阿隆索所在的车队来筛选特定比赛的结果,以便找到他的队友 – 这样对于第一场比赛,我得到阿隆索和马萨,但对于第二场比赛,我得到阿隆索和汉密尔顿。所以过滤后的预期结果是:
race driver team ...
1 Alonso Ferrari
1 Massa Ferrari
2 Alonso McLaren
2 Hamilton McLaren
...
我使用过滤器将行限制为只有 Alonso 的行:
df[df.driver == "Alonso"]
或者通过以下方式将行限制为所有 Ferrari 和 McLaren 的行(数据中除这两支队伍外还有其他队伍):
df.team.isin(teams)
其中teams
列出了所有驾驶员是 Alonso 的行所列出的所有队伍,但我似乎无法将这两个过滤器结合起来,以便按照 Alonso 参赛的队伍进行条件过滤。
解决方案
代码
使用 groupby + filter
df.groupby(['race', 'team']).filter(lambda x: x['driver'].eq('Alonso').sum() > 0)
输出:
race driver team
0 1 Alonso Ferrari
1 1 Massa Ferrari
3 2 Alonso McLaren
4 2 Hamilton McLaren
示例代码
import pandas as pd
data1 = {'race': [1, 1, 1, 2, 2, 2],
'driver': ['Alonso', 'Massa', 'Hamilton', 'Alonso', 'Hamilton', 'Massa'],
'team': ['Ferrari', 'Ferrari', 'McLaren', 'McLaren', 'McLaren', 'Ferrari']}
df = pd.DataFrame(data1)
df
race driver team
0 1 Alonso Ferrari
1 1 Massa Ferrari
2 1 Hamilton McLaren
3 2 Alonso McLaren
4 2 Hamilton McLaren
5 2 Massa Ferrari