![](/img/trans.png)
[英]Pandas add values in one column for all the same values in another column
[英]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
值的所有實例也會被刪除。 所以在上面的例子中,有所有行123
在col1
被丟棄,因為有一個b
這是從不同a
的。
保留與col1
中唯一值相對應的行。 最后,在col1
的所有重復值中(假設所有重復值都具有相同的對應col2
值),僅保留一個。 因此輸出為:
col1 col2
6 456 d
8 678 e
9 897 f
有沒有不使用for
循環的有效方法嗎?
IIUC groupby
與nunique
然后我們做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中搜索重復項時,可以利用subset
並keep
參數。
樣品:
# 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.