python - 仅删除组内的重复项
问题描述
我只想从数据框中删除特定子集中的重复项。在“A”列中的每个“规范”下,我想删除重复项,但我想在整个数据框中保留重复项(第一个“规范”下的某些行可能与第二个“规范”,但在“规范”下,直到下一个“规范”我想删除重复项)
这是数据框
df
A B C
spec first second
test text1 text2
act text12 text13
act text14 text15
test text32 text33
act text34 text35
test text85 text86
act text87 text88
test text1 text2
act text12 text13
act text14 text15
test text85 text86
act text87 text88
spec third fourth
test text1 text2
act text12 text13
act text14 text15
test text85 text86
act text87 text88
test text1 text2
act text12 text13
act text14 text15
test text85 text86
act text87 text88
这就是我想要的:
df
A B C
spec first second
test text1 text2
act text12 text13
act text14 text15
test text32 text33
act text34 text35
test text85 text86
act text87 text88
spec third fourth
test text1 text2
act text12 text13
act text14 text15
test text85 text86
act text87 text88
我可以将数据帧拆分为“小”数据帧,然后在 for 循环中为每个“小”数据帧删除重复项,最后将它们连接起来,但我想知道是否还有其他解决方案。
我也尝试过并且成功了:
dfList = df.index[df["A"] == "spec"].tolist()
dfList = np.asarray(dfList)
for dfL in dfList:
idx = np.where(dfList == dfL)
if idx[0][0]!=(len(dfList)-1):
df.loc[dfList[idx[0][0]]:dfList[idx[0][0]+1]-1]
= df.loc[dfList[idx[0][0]]:dfList[idx[0][0]+1]-1].drop_duplicates()
else:
df.loc[dfList[idx[0][0]]:] = df.loc[dfList[idx[0][0]]:].drop_duplicates()
编辑:我必须将其添加到最后:
df.dropna(how='all', inplace=True)
但我只是想知道是否还有其他解决方案。
解决方案
使用groupby
+ duplicated
:
df[~df.groupby(df.A.eq('spec').cumsum()).apply(lambda x: x.duplicated()).values]
A B C
0 spec first second
1 test text1 text2
2 act text12 text13
3 act text14 text15
4 test text32 text33
5 act text34 text35
6 test text85 text86
7 act text87 text88
13 spec third fourth
14 test text1 text2
15 act text12 text13
16 act text14 text15
17 test text85 text86
18 act text87 text88
细节
我们使用 找到特定“规范”条目下的所有行cumsum
。组标签是:
df.A.eq('spec').cumsum()
0 1
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1
11 1
12 1
13 2
14 2
15 2
16 2
17 2
18 2
19 2
20 2
21 2
22 2
23 2
Name: A, dtype: int64
然后在此系列上进行分组,并计算每个组的重复项:
df.groupby(df.A.eq('spec').cumsum()).apply(lambda x: x.duplicated()).values
array([False, False, False, False, False, False, False, False, True,
True, True, True, True, False, False, False, False, False,
False, True, True, True, True, True])
由此,剩下的就是保留与“False”相对应的那些行(即不重复)。
推荐阅读
- sql - .NET 多行 SQL 插入支持基于集合的操作
- java - 如何创建地图
> java 8 单流? - vue.js - 如何在纯 js 文件中编写 vue 组件?[没有构建和 webpack 的 Vue.js]
- php - Symfony Finder - ““1”目录不存在f
- ruby - Ruby 并排错误 (sxstrace)
- php - 使用 Zend 或 Composer 在 PHP 中自动加载是如何工作的?
- ssl - SSL - 升级到 TLSv1.3 的问题
- sql - SQL 始终加密 CMK 证书存储最佳实践
- javascript - JavaScript - Chrome 打开新窗口,音频自动播放
- if-statement - if-then 规则推理的大师级人物如何?