我有一个 pandas DataFrame。例如,
Date Time A B C
0 1.1.2015 00:00 2 16 50
1 1.1.2015 01:00 2 9 50
2 1.1.2015 02:00 4 6 50
3 1.1.2015 03:00 3 7 31
4 1.1.2015 04:00 2 7 42
5 1.1.2015 05:00 2 7 22
6 1.1.2015 06:00 2 7 14
7 1.1.2015 07:00 2 11 50
8 1.1.2015 08:00 3 11 28
9 1.1.2015 09:00 2 18 17
我想删除连续重复超过 3 次但保留第一个的数字。我需要删除:
1- 第 5、6 和 7 行,因为 A 列中有四个 2,我不需要最后三个。
2- 第 4,5 和 6 行,因为 B 列中有四个 7
3- 第 1 行和第 2 行,因为 C 列中有三个 50
所以我想要的输出是这样的:
Date Time A B C
0 1.1.2015 00:00 2 16 50
1 1.1.2015 03:00 3 7 31
2 1.1.2015 08:00 3 11 28
3 1.1.2015 09:00 2 18 17
我搜索过类似的问题,我发现这个问题最相似: “Removing values that repeat more than 5 times in Pandas DataFrame ”,我试图根据我的问题对其进行调整,但我做不到(我是 python 的初学者)。谁能帮帮我?
谢谢。
最佳答案
在 itertools
的帮助下,你可以做到:
import itertools
import numpy as np
def f(serie):
xs = []
for el, gr in itertools.groupby(serie):
x = np.repeat(True, len(list(gr)))
if len(x)>=3:
x[1:]=False
xs.append(x)
return np.concatenate(xs)
df[df[['A','B','C']].apply(f, axis=0).apply(np.all, axis=1)]
#Out[64]:
# Date Time A B C
#0 1.1.2015 00:00 2 16 50
#3 1.1.2015 03:00 3 7 31
#8 1.1.2015 08:00 3 11 28
#9 1.1.2015 09:00 2 18 17
想法是使用效用函数 f
来计算列中连续元素的数量并创建相关联的所需 bool 掩码 - 例如,您可以检查 f(df ['A'])
。然后使用 np.all
聚合这些 bool 掩码以过滤您的原始数据帧。
关于python - 删除重复超过 3 次的值,除了 Pandas DataFrame 中的第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36177339/