繁体   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