如何在Pandas DataFrame中选择重复行之间的记录
解决方法
要选中同一司机同一出发地重复行之间的记录,我们可以通过标记重复项的出现位置,再提取对应区间内的行来实现,具体步骤如下:
1. 构建DataFrame
首先加载数据并创建Pandas DataFrame:
import pandas as pd data = {'driver': ['Tom', 'Tom', 'Tom', 'Nick', 'Nick', 'Nick', 'Nick', 'Krish', 'Krish', 'Krish', 'Krish', 'Jack', 'Jack', 'Jack'], 'from': ['Manhattan', 'Brooklyn', 'Queens', 'Manhattan', 'Brooklyn', 'Manhattan', 'Queens', 'Queens', 'Brooklyn', 'Manhattan', 'Queens', 'Queens', 'Brooklyn', 'Manhattan'], 'distance': [35, 40, 25, 35, 35, 75, 25, 40, 35, 75, 25, 25, 40, 35]} df = pd.DataFrame(data)
2. 标记重复项的出现次数
对每个driver+from组合,用cumcount()标记每行是该组合的第几次出现:
df['occurrence'] = df.groupby(['driver', 'from']).cumcount() + 1
3. 获取重复项的索引区间
提取每个组合第一次和第二次出现的索引,确定需要保留的行区间:
# 提取第一次出现的索引 first_occur = df[df['occurrence'] == 1].reset_index().rename(columns={'index': 'first_idx'}) # 提取第二次出现的索引 second_occur = df[df['occurrence'] == 2].reset_index().rename(columns={'index': 'second_idx'}) # 合并得到每个重复组合的索引区间 interval_df = pd.merge( first_occur[['driver', 'from', 'first_idx']], second_occur[['driver', 'from', 'second_idx']], on=['driver', 'from'] )
4. 提取目标区间内的行
遍历每个索引区间,筛选出区间内的行并合并结果:
result_list = [] for _, row in interval_df.iterrows(): # 保留从第一次出现到第二次出现前的所有行(左闭右开) subset = df.loc[row['first_idx'] : row['second_idx'] - 1] result_list.append(subset) # 合并所有结果并去重(避免行被多个区间重复选中) result = pd.concat(result_list).drop_duplicates().drop(columns='occurrence')
最终得到的result就是你需要的结果:
| index | driver | from | distance |
|---|---|---|---|
| 3 | Nick | Manhattan | 35 |
| 4 | Nick | Brooklyn | 35 |
| 7 | Krish | Queens | 40 |
| 8 | Krish | Brooklyn | 35 |
| 9 | Krish | Manhattan | 75 |
内容的提问来源于stack exchange,提问作者Smoooky
相关产品推荐
相关产品推荐

