如何检查同一数据框列中的重复值并通过根据频率删除行来应用 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 pandas 或 pyspark 中做到这一点的吗?
我在检查重复项时遇到了麻烦,并且可能将“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_values
与DataFrame.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 条件?的主要内容,如果未能解决你的问题,请参考以下文章