如何在Pandas中删除指定重复项并保留首个出现的值?
解决DataFrame中保留连续'A'列'df'组首个值的问题
嘿,我来帮你搞定这个需求!你需要删除DataFrame里列A为'df'的重复项,但只保留每组连续重复'df'的第一个值,非'df'的行全部保留对吧?看你给的原始数据和期望结果,核心就是对连续的'df'块做去重,只留第一个。
具体实现步骤(用Pandas)
我直接给你可运行的代码,再一步步解释:
首先,先把你的原始数据转换成DataFrame:
import pandas as pd # 你的原始数据 data = { 'A': ['qw', 'er', 'ew', 'df', 'df', 'df', 'df', 'we', 'we', 'df', 'df', 'we', 'qw'], 'B': [1, 2, 4, 34, 2, 3, 4, 2, 4, 34, 3, 4, 2], 'C': [3, 4, 8, 34, 5, 3, 4, 5, 4, 9, 3, 7, 2], 'D': [1, 2, 44, 34, 2, 7, 7, 5, 4, 34, 9, 4, 7], 'E': [1, 6, 4, 34, 2, 3, 4, 2, 4, 34, 3, 4, 2] } df = pd.DataFrame(data)
接下来,我们需要给连续的行分组:
- 当某一行的A列不是'df',或者和前一行的A列值不一样时,就标记为一个新组
- 用这个分组键,我们就能把连续的'df'分成独立的组
# 创建分组标记:满足条件时生成新的分组ID group_key = (df['A'] != df['A'].shift()) | (df['A'] != 'df') group_key = group_key.cumsum()
最后一步过滤数据:
- 对每个分组,如果组内是'df'开头的,只保留第一行;否则保留整个组的所有行
# 分组过滤得到结果 result = df.groupby(group_key).apply(lambda x: x.iloc[[0]] if x['A'].iloc[0] == 'df' else x).reset_index(drop=True)
看看结果
运行完上面的代码,result就是你要的样子:
| A | B | C | D | E |
|---|---|---|---|---|
| qw | 1 | 3 | 1 | 1 |
| er | 2 | 4 | 2 | 6 |
| ew | 4 | 8 | 44 | 4 |
| df | 34 | 34 | 34 | 34 |
| we | 2 | 5 | 5 | 2 |
| we | 4 | 4 | 4 | 4 |
| df | 34 | 9 | 34 | 34 |
| we | 4 | 7 | 4 | 4 |
| qw | 2 | 2 | 7 | 2 |
这样就精准实现了你的需求:连续的'df'组只留第一个,其他行全部保留,完全匹配你给出的期望结果~
内容的提问来源于stack exchange,提问作者С. Дэлгэрцэцэг




