如何检查同一数据框列中的重复值并通过根据频率删除行来应用 if 条件?

Posted

技术标签:

【中文标题】如何检查同一数据框列中的重复值并通过根据频率删除行来应用 if 条件?【英文标题】:How to check for duplicate values in the same dataframe column and apply if condition by dropping the row based on frequency? 【发布时间】:2021-01-15 08:57:00 【问题描述】:

数据框:

name Location Rating Frequency
Ali Nasi Kandar 1 star 1
Ali Baskin Robin 4 star 3
Ali Nasi Ayam 3 star 1
Ali Burgergrill 2 star 2
Lee Fries 1 star 3
Abu Mcdonald 3 star 3
Abu KFC 3 star 1
Ahmad Nandos 3 star 2
Ahmad Burgerdhil 2 star 3
Ahmad Kebab 1 star 10

这是样本数据集。逻辑是:

第一个条件:如果name有重复值,检查频率,看看哪个更高,删除更低的行频率

第二个条件:如果没有重复名称(例如:Lee),则保留该行

第三个条件:评分相同(例如:阿布),保留第一个值

所需的输出:

name Location Rating Frequency
Ali Baskin Robin 4 star 3
Lee Fries 1 star 3
Abu KFC 3 star 1
Ahmad Kebab 1 star 10

你们中有人知道我是如何在 python pandaspyspark 中做到这一点的吗?

我在检查重复项时遇到了麻烦,并且可能将“if 条件”应用于此数据帧

【问题讨论】:

你能展示你尝试了什么吗?什么不起作用? 对于Abu 需要3,因为第一个值(也是最大值) 这是真的阿布应该是麦当劳 【参考方案1】:

Pyspark 解决方案。您可以在适当排序和分区的窗口上使用row_number,并获取行号为 1 的行。

from pyspark.sql import functions as F, Window

df2 = df.withColumn(
    'rn', 
    F.row_number().over(Window.partitionBy('name').orderBy(F.desc('frequency')))
).filter('rn = 1').drop('rn')

df2.show()
+-----+------------+------+---------+
| name|    Location|Rating|Frequency|
+-----+------------+------+---------+
|Ahmad|       Kebab|1 star|       10|
|  Abu|    Mcdonald|3 star|        3|
|  Lee|       Fries|1 star|        3|
|  Ali|Baskin Robin|4 star|        3|
+-----+------------+------+---------+

【讨论】:

【参考方案2】:

DataFrame.sort_valuesDataFrame.drop_duplicates 和最后一个排序索引一起使用:

df = (df.sort_values(['Frequency','Rating'], 
                     ascending=[False, True])
        .drop_duplicates('name')  
        .sort_index())
print (df)
    name      Location  Rating  Frequency
1    Ali  Baskin Robin  4 star          3
4    Lee         Fries  1 star          3
5    Abu      Mcdonald  3 star          3
9  Ahmad         Kebab  1 star         10

【讨论】:

谢谢你太棒了。嗯我这里看到一个错误,因为第一行是错误的,位置应该是频率最高的 Baskin Robin

以上是关于如何检查同一数据框列中的重复值并通过根据频率删除行来应用 if 条件?的主要内容,如果未能解决你的问题,请参考以下文章

熊猫如何通过数据框列值获取行索引

通过引用字符串位置检查数据框列中的子字符串

如何创建一个计算数据框列中 ID 频率的列?

根据字典替换数据框列中的值不起作用[重复]

检查列表中的单词并在 pandas 数据框列中删除这些单词

根据其他列值从数据框列中的列表中删除最后一个元素