簡體   English   中英

Pandas - 與刪除重復項相反,先保留

[英]Pandas - Opposite of drop duplicates, keep first

我熟悉如何刪除重復的行,然后使用firstlastnone的參數。 沒有什么太復雜的,有很多例子(即這里)。

但是,我正在尋找的是有一種方法可以找到重復項,而不是刪除所有重復項並保留第一個,如果我有重復項,則保留所有重復項但刪除第一個:

因此,不是“如果重復則刪除,保留第一個”,我想要“如果重復則保留,首先刪除”

例子:

鑒於此數據框,並查看cost列中的重復項:

    ID name type cost
0    0    a   bb    1
1    1    a   cc    2 <--- there are duplicates, so drop this row
2  1_0    a   dd    2
3    2    a   ee    3 <--- there are duplicates, so drop this row
4  2_0    a   ff    3
5  2_1    a   gg    3
6  2_2    a   hh    3

如果cost列中有重復項,只需刪除第一項,保留其余項。

所以我的輸出是:

    ID name type cost
0    0    a   bb    1
2  1_0    a   dd    2
4  2_0    a   ff    3
5  2_1    a   gg    3
6  2_2    a   hh    3

這是示例數據框:

import pandas as pd

df = pd.DataFrame([
['0',   'a',    'bb',   '1'],
['1',   'a',    'cc',   '2'],
['1_0', 'a',    'dd',   '2'],
['2',   'a',    'ee',   '3'],
['2_0', 'a',    'ff',   '3'],
['2_1', 'a',    'gg',   '3'],
['2_2', 'a',    'hh',   '3']], columns = ['ID', 'name', 'type', 'cost'])

您可以使用按位ORDataFrame.duplicated創建的 2 個掩碼,並通過boolean indexing過濾:

df = df[df.duplicated('cost') | ~df.duplicated('cost', keep=False)]
print (df)
    ID name type cost
0    0    a   bb    1
2  1_0    a   dd    2
4  2_0    a   ff    3
5  2_1    a   gg    3
6  2_2    a   hh    3

詳情

print (df.assign(mask1=df.duplicated('cost'), mask2=~df.duplicated('cost', keep=False)))
    ID name type cost  mask1  mask2
0    0    a   bb    1  False   True
1    1    a   cc    2  False  False
2  1_0    a   dd    2   True  False
3    2    a   ee    3  False  False
4  2_0    a   ff    3   True  False
5  2_1    a   gg    3   True  False
6  2_2    a   hh    3   True  False

您可以使用XOR (^)運算符執行以下操作,它會查找兩個條件都為真。 因為我們使用NOT (~)運算符。 它尋找相反的情況,例如: both False

df[~(df.cost.duplicated(keep=False) ^ df.cost.duplicated())]

輸出

    ID name type cost
0    0    a   bb    1
2  1_0    a   dd    2
4  2_0    a   ff    3
5  2_1    a   gg    3
6  2_2    a   hh    3

如果重復存在,您可以使用groupby並傳遞一個 lambda 函數來獲取第一個重復之后的記錄:

>>> df.groupby('cost').apply(lambda group: group.iloc[1:] if len(group) > 1 else group).reset_index(drop=True)
    ID  cost name type
0    0     1    a   bb
1  1_0     2    a   dd
2  2_0     3    a   ff
3  2_1     3    a   gg
4  2_2     3    a   hh

您可以使用以下代碼:

# Import pandas library 
import pandas as pd 

# initialize list of lists so i can create duplicate datas
data = [['tom', 10], ['nick', 15], ['juli', 14], ['nick', 15], ['julia', 140],
        ['tom', 10],['tom', 10],['tom', 10]] 

# Create the pandas DataFrame 
df = pd.DataFrame(data, columns = ['Name', 'Age']) 

# print dataframe. 
print(df)

# Now the logic begins from here

colnames=[]

for col in df.columns:
    colnames.append(col)


listdf=df.values.tolist()
temp=[]

for i in range(0,len(listdf)):
    if(listdf.count(listdf[i])>1 and listdf[i] not in temp):
        temp.append(listdf[i])

df = pd.DataFrame(temp, columns =colnames)

print("dataframe with only duplciates ")
print(df)

暫無
暫無

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

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