簡體   English   中英

刪除熊貓中所有具有同一列值而另一列具有不同值的行

[英]Dropping all rows in pandas having same values in one column and different values in another

假設我具有以下類型的數據框:

   col1 col2
0   123    a
1   123    a
2   123    a
3   123    b
4   345    a
5   345    c
6   456    d
7   456    d
8   678    e
9   897    f

對於col1的特定重復值,所有對應的col2值應完全相同。 如果甚至相應的col2值之一都不相同,那么該col1值的所有實例也會被刪除。 所以在上面的例子中,有所有行123col1被丟棄,因為有一個b這是從不同a的。

保留與col1中唯一值相對應的行。 最后,在col1的所有重復值中(假設所有重復值都具有相同的對應col2值),僅保留一個。 因此輸出為:

   col1 col2
6   456    d
8   678    e
9   897    f

有沒有不使用for循環的有效方法嗎?

IIUC groupbynunique然后我們做isin + drop_duplicates

s=df.groupby('col1').col2.nunique().ne(1)
yourdf=df.loc[~df.col1.isin(s.index[s]),:].drop_duplicates()
yourdf
Out[974]: 
   col1 col2
6   456    d
8   678    e
9   897    f

在DataFrame中搜索重復項時,可以利用subsetkeep參數。

樣品:

# make df
data = zip([123, 123, 123, 123, 345, 345, 456, 456, 678, 897], 
           ['a', 'a', 'a', 'b', 'a', 'c', 'd', 'd', 'e', 'f'])
df = pd.DataFrame(data=data, columns=['col1', 'col2'])

# dedupe
df.drop_duplicates().drop_duplicates(subset=['col1'], keep=False)

# output
#   col1 col2
# 6  456    d
# 8  678    e
# 9  897    f

第一個.drop_duplicates()保留每個唯一行的第一個實例。 第二個命令刪除col1值相同的所有行,而與col2無關(不保留任何行)。 因為此時我們只處理唯一的行,所以.drop_duplicates(subset=['col1'], keep=False)必然只刪除具有重復的col1值和不同的col2值的行

暫無
暫無

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

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