簡體   English   中英

如果兩列中的連續值相同,如何在python中刪除重復項?

[英]How to drop duplicates in python if consecutive values are the same in two columns?

我有一個如下數據框:

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也相同,則在連續出現的地方保留第一個值。 EG在這里出現的情況'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

我嘗試了一些分組方式,但不知道該如何放棄。

碼:

df['consecutive'] = (df['B'] != df['B'].shift(1)).cumsum()
test=df.groupby('consecutive',as_index=False).apply(lambda x: (x['B'].head(1),x.shape[0],
                                                       x['C'].iloc[-1] - x['C'].iloc[0]))

該小組歸還了我一系列,但我想刪除。

通過2列添加DataFrame.drop_duplicates

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

或用|鏈接這兩個條件 對於按位OR

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[(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

一種簡單的方法來檢查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

給定以下數據框,如果我正確理解您的問題:

df = pd.DataFrame({'B': [8, 8, 9, 9, 6, 4, 11], 'C': [22, 23, 45, 45, 12, 10, 12],})

此單行代碼使用drop_duplicates方法解決了您的問題:

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

它給出了預期的結果:

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

使用diffneany over axis=1

注意:此方法僅適用於數字列

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

產量

   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

然后我們檢查一行中的any值是否不等於( ne )等於0

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM