Python 删除行以保持连续的重复值-大熊猫
我试图删除至少连续3行中特定列中的值不重复的行。使用下面的df,我想删除Python 删除行以保持连续的重复值-大熊猫,python,pandas,Python,Pandas,我试图删除至少连续3行中特定列中的值不重复的行。使用下面的df,我想删除code中连续值小于3的行 df = pd.DataFrame({ 'Time' : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15], 'ID' : ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'], 'Code' : ['X', 'X', 'X', 'Y', 'Y',
code
中连续值小于3的行
df = pd.DataFrame({
'Time' : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
'ID' : ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'],
'Code' : ['X', 'X', 'X', 'Y', 'Y', 'X', 'X', 'Y', 'Y', 'Y', 'Y', 'Y', 'X', 'X', 'X'],
'X' : [3, 4, 5, 1, 2, 5, 6, 2, 1, 6, 7, 2, 7, 8, 1],
'Y' : [2, 4, 5, 1, 2, 5, 5, 2, 2, 6, 5, 1, 5, 4, 1],
})
m = (df["Code"].eq(df["Code"].shift()) | df["Code"].eq(df["Code"].shift(-3)))
print (df[m])
预期产出:
Time ID Code X Y
0 1 A X 3 2
1 2 A X 4 4
2 3 A X 5 5
7 8 B Y 2 2
8 9 B Y 1 2
9 10 B Y 6 6
10 11 C Y 7 5
11 12 C Y 2 1
12 13 C X 7 5
13 14 C X 8 4
14 15 C X 1 1
创建连续的组,首先: 然后通过以下方式进行过滤: 具有和的替代解决方案:
您可以定义一个自定义的grouper,用于识别连续
代码的GROUP,并使用code
的计数进行分组和转换。最后,您希望保持这些值高于或等于3:
g = df.Code.ne(df.Code.shift()).cumsum()
df[df.groupby(g).Code.transform('count').ge(3)]
Time ID Code X Y
0 1 A X 3 2
1 2 A X 4 4
2 3 A X 5 5
7 8 B Y 2 2
8 9 B Y 1 2
9 10 B Y 6 6
10 11 C Y 7 5
11 12 C Y 2 1
12 13 C X 7 5
13 14 C X 8 4
14 15 C X 1 1
第一种选择会更快?你有没有做过一些关于尺寸和数量的基准测试?只是不确定是哪一个preferable@yatu-我认为两个不同的函数,在这里工作相同,因为从未丢失值,所以不确定是否通常比较(排除,包括NaN)
df = df[s.map(s.value_counts()).ge(3)]
df = df[s.groupby(s).transform('size').ge(3)]
print (df)
Time ID Code X Y
0 1 A X 3 2
1 2 A X 4 4
2 3 A X 5 5
7 8 B Y 2 2
8 9 B Y 1 2
9 10 B Y 6 6
10 11 C Y 7 5
11 12 C Y 2 1
12 13 C X 7 5
13 14 C X 8 4
14 15 C X 1 1
g = df.Code.ne(df.Code.shift()).cumsum()
df[df.groupby(g).Code.transform('count').ge(3)]
Time ID Code X Y
0 1 A X 3 2
1 2 A X 4 4
2 3 A X 5 5
7 8 B Y 2 2
8 9 B Y 1 2
9 10 B Y 6 6
10 11 C Y 7 5
11 12 C Y 2 1
12 13 C X 7 5
13 14 C X 8 4
14 15 C X 1 1