如果两列中的连续值相同,如何在python中删除重复项?

如果两列中的连续值相同,如何在python中删除重复项?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个如下所示的数据帧: A B C 1 8 23 2 8 22 3 9 45 4 9 45 5 6 12 6 4 10 7 11 12 我想删除重复项,如果C也是相同的,则保留连续出现的第一个值。 例如,此处出现的“9”是重复的B列,它们在“C”列中的对应出现也是重复的“45”。在这种情况下,我希望保留第一次出现 预期产出: A B C 1 8 23 2 8 22 3 9 45 5 6 1

我有一个如下所示的数据帧:

A   B   C
1   8   23
2   8   22
3   9   45
4   9   45
5   6   12
6   4   10
7   11  12
我想删除重复项,如果C也是相同的,则保留连续出现的第一个值。 例如,此处出现的“9”是重复的B列,它们在“C”列中的对应出现也是重复的“45”。在这种情况下,我希望保留第一次出现

预期产出:

A   B   C
1   8   23
2   8   22
3   9   45
5   6   12
6   4   10
7   11  12
我试过一些分组,但不知道如何放弃

代码:

此group by返回一个系列,但我想删除。

添加2列:

df['consecutive'] = (df['B'] != df['B'].shift(1)).cumsum()
df = df.drop_duplicates(['consecutive','C'])
print (df)
   A   B   C  consecutive
0  1   8  23            1
1  2   8  22            1
2  3   9  45            2
4  5   6  12            3
5  6   4  10            4
6  7  11  12            5
或使用
|
按位
链接这两个条件:

df = df[(df['B'] != df['B'].shift()) | (df['C'] != df['C'].shift())]
print (df)
   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12
添加两列:

df['consecutive'] = (df['B'] != df['B'].shift(1)).cumsum()
df = df.drop_duplicates(['consecutive','C'])
print (df)
   A   B   C  consecutive
0  1   8  23            1
1  2   8  22            1
2  3   9  45            2
4  5   6  12            3
5  6   4  10            4
6  7  11  12            5
或使用
|
按位
链接这两个条件:

df = df[(df['B'] != df['B'].shift()) | (df['C'] != df['C'].shift())]
print (df)
   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12

用于过滤此类记录的oneliner是:

df[(df[['B', 'C']].shift() != df[['B', 'C']]).any(axis=1)]
因此,我们在此检查列
['B','C']
是否与移位的行相同,如果不相同,则保留以下值:

>>> df[(df[['B', 'C']].shift() != df[['B', 'C']]).any(axis=1)]
   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12
这是非常可扩展的,因为我们可以定义一个函数,该函数可以轻松地对任意数量的值进行操作:

def drop_consecutive_duplicates(df, *colnames):
    dff = df[list(colnames)]
    return df[(dff.shift() != dff).any(axis=1)]
因此,您可以使用以下方法进行过滤:

drop_consecutive_duplicates(df, 'B', 'C')

用于过滤此类记录的oneliner是:

df[(df[['B', 'C']].shift() != df[['B', 'C']]).any(axis=1)]
因此,我们在此检查列
['B','C']
是否与移位的行相同,如果不相同,则保留以下值:

>>> df[(df[['B', 'C']].shift() != df[['B', 'C']]).any(axis=1)]
   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12
这是非常可扩展的,因为我们可以定义一个函数,该函数可以轻松地对任意数量的值进行操作:

def drop_consecutive_duplicates(df, *colnames):
    dff = df[list(colnames)]
    return df[(dff.shift() != dff).any(axis=1)]
因此,您可以使用以下方法进行过滤:

drop_consecutive_duplicates(df, 'B', 'C')

您可以计算一系列要删除的行,然后删除它们:

to_drop = (df['B'] == df['B'].shift())&(df['C']==df['C'].shift())
df = df[~to_drop]
正如预期的那样:

   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12

您可以计算一系列要删除的行,然后删除它们:

to_drop = (df['B'] == df['B'].shift())&(df['C']==df['C'].shift())
df = df[~to_drop]
正如预期的那样:

   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12

检查B行和C行之间差异的简单方法是,如果差异为0(重复值),则删除值,代码为

 df[ ~((df.B.diff()==0) & (df.C.diff()==0)) ]

检查B行和C行之间差异的简单方法是,如果差异为0(重复值),则删除值,代码为

 df[ ~((df.B.diff()==0) & (df.C.diff()==0)) ]

代码

df1 = df.drop_duplicates(subset=['B', 'C'])  
结果

   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12
   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12

代码

df1 = df.drop_duplicates(subset=['B', 'C'])  
结果

   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12
   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12

如果我正确理解您的问题,考虑到以下数据框架:

df = pd.DataFrame({'B': [8, 8, 9, 9, 6, 4, 11], 'C': [22, 23, 45, 45, 12, 10, 12],})
此单行代码使用以下方法解决了您的问题:

它给出了预期的结果:

    B   C
0   8  22
1   8  23
2   9  45
4   6  12
5   4  10
6  11  12

如果我正确理解您的问题,考虑到以下数据框架:

df = pd.DataFrame({'B': [8, 8, 9, 9, 6, 4, 11], 'C': [22, 23, 45, 45, 12, 10, 12],})
此单行代码使用以下方法解决了您的问题:

它给出了预期的结果:

    B   C
0   8  22
1   8  23
2   9  45
4   6  12
5   4  10
6  11  12
使用,并在轴=1上:

注意:此方法仅适用于数字列

输出

   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12
   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12

详细信息

df[['B', 'C']].diff()

     B     C
0  NaN   NaN
1  0.0  -1.0
2  1.0  23.0
3  0.0   0.0
4 -3.0 -33.0
5 -2.0  -2.0
6  7.0   2.0
然后,我们检查一行中的
任何值是否与
0
不相等(
ne
):

df[['B', 'C']].diff().ne(0).any(axis=1)

0     True
1     True
2     True
3    False
4     True
5     True
6     True
dtype: bool
使用,并在轴=1上:

注意:此方法仅适用于数字列

输出

   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12
   A   B   C
0  1   8  23
1  2   8  22
2  3   9  45
4  5   6  12
5  6   4  10
6  7  11  12

详细信息

df[['B', 'C']].diff()

     B     C
0  NaN   NaN
1  0.0  -1.0
2  1.0  23.0
3  0.0   0.0
4 -3.0 -33.0
5 -2.0  -2.0
6  7.0   2.0
然后,我们检查一行中的
任何值是否与
0
不相等(
ne
):

df[['B', 'C']].diff().ne(0).any(axis=1)

0     True
1     True
2     True
3    False
4     True
5     True
6     True
dtype: bool

只有连续的?或在整个数据帧上重复?仅连续?仅连续?或在整个数据帧上重复?仅连续