![](/img/trans.png)
[英]How to SELECT DISTINCT() and then keep rows with most frequent value in another column?
[英]Pandas drop duplicates on one column and keep only rows with the most frequent value in another column
我有一個 dataframe,如下所示:
ip_address malware_type
ip_1 malware_1
ip_2 malware_2
ip_1 malware_1
ip_1 malware_1
ip_1 malware_2
ip_2 malware_2
ip_2 malware_3
.
.
.
我想根據“ip_address”列刪除重復行,但是當刪除發生時,我只想保留每個 IP 中最常見的“malware_type”值。因此生成的 dataframe 應該如下所示:
ip_address malware_type
ip_1 malware_1
ip_2 malware_2
.
.
.
我真的很感激任何有助於實現上述目標的幫助。 謝謝。
讓我們試試mode
s=df.groupby('ip_address').malware_type.agg(lambda x : x.mode()[0]) # .reset_index()
Out[56]:
ip_address
ip_1 malware_1
ip_2 malware_2
Name: malware_type, dtype: object
我有一個 dataframe,如下所示:
ip_address malware_type
ip_1 malware_1
ip_2 malware_2
ip_1 malware_1
ip_1 malware_1
ip_1 malware_2
ip_2 malware_2
ip_2 malware_3
.
.
.
我想根據“ip_address”列刪除重復的行,但是當刪除發生時,我只想保留每個 IP 最常見的“malware_type”值。 所以生成的 dataframe 應該如下所示:
ip_address malware_type
ip_1 malware_1
ip_2 malware_2
.
.
.
我真的很感激任何幫助來實現上述目標。 謝謝。
您可以將GroupBy.agg
與pd.Series.mode
一起使用
df.groupby('ip_address').malware_type.agg(pd.Series.mode)
ip_address
ip_1 malware_1
ip_2 malware_2
Name: malware_type, dtype: object
您可以在此處使用scipy.stats.mode
。
from scipy.stats import mode
df.groupby('ip_address').malware_type.agg(lambda x: mode(x).mode)
ip_address
ip_1 malware_1
ip_2 malware_2
Name: malware_type, dtype: object
另一種是使用collection.Counter
的most_common
方法。
def md(s):
c = Counter(s)
return c.most_common(1)[0][0]
df.groupby('ip_address').malware_type.agg(md)
ip_address
ip_1 malware_1
ip_2 malware_2
Name: malware_type, dtype: object
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.