Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除行以保持连续的重复值-大熊猫_Python_Pandas - Fatal编程技术网

Python 删除行以保持连续的重复值-大熊猫

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',

我试图删除至少连续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', '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