簡體   English   中英

Pandas 刪除一列中的重復項,只保留另一列中具有最頻繁值的行

[英]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.aggpd.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.Countermost_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.

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