pyspark 过滤出n个重复项

2eafrhcq  于 4个月前  发布在  Spark
关注(0)|答案(1)|浏览(56)

我有一个类似于以下的框架:
| ID|名字|姓氏(_N)|性|国家|
| --|--|--|--|--|
| 01 |约翰|Doe|男性|美国|
| 02 |约翰|Doe|男性|加拿大|
| 03 |约翰|Doe|男性|墨西哥|
| 04 |马克|凯|男性|意大利|
| 05 |约翰|Doe|男性|西班牙|
| 06 |马克|凯|男性|法国|
| 07 |约翰|Doe|男性|秘鲁|
| 08 |马克|凯|男性|印度|
| 09 |马克|凯|男性|老挝|
| 10 |约翰|Doe|男性|贝宁|
正如你所看到的,id和country列始终是唯一的,但是基于first_name,last_name和sex列的字符串框架有重复项。我希望能够找到这样的重复项,并且只保留其中的3个(最好是最后3个),并删除其余的。因此,在此操作之后,生成的字符串框架应该如下所示:
| ID|名字|姓氏(_N)|性|国家|
| --|--|--|--|--|
| 05 |约翰|Doe|男性|西班牙|
| 06 |马克|凯|男性|法国|
| 07 |约翰|Doe|男性|秘鲁|
| 08 |马克|凯|男性|印度|
| 09 |马克|凯|男性|老挝|
| 10 |约翰|Doe|男性|贝宁|
我该怎么做?任何帮助都很感激!
我试过这个:

window_spec = Window.partitionBy('first_name', 'last_name', 'sex').orderBy(F.desc('id'))
df_with_row_number = df.withColumn('row_number', F.row_number().over(window_spec))
filtered_df = df_with_row_number.filter('row_number <= 3')
result_df = filtered_df.drop('row_number')

字符串
这确实给了我给予我想要的结果,但我想知道是否有更有效的方法来实现这一点,因为它是一个具有更多行和列的大型数据集。

n3ipq98p

n3ipq98p1#

你可以在你的框架中使用groupby方法。下面是一个例子:

import pandas as pd

# Your original dataframe
data = {
    'id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'first_name': ['John', 'John', 'John', 'Mark', 'John', 'Mark', 'John', 'Mark', 'Mark', 'John'],
    'last_name': ['Doe', 'Doe', 'Doe', 'Kay', 'Doe', 'Kay', 'Doe', 'Kay', 'Kay', 'Doe'],
    'sex': ['Male', 'Male', 'Male', 'Male', 'Male', 'Male', 'Male', 'Male', 'Male', 'Male'],
    'country': ['USA', 'Canada', 'Mexico', 'Italy', 'Spain', 'France', 'Peru', 'India', 'Laos', 'Benin']
}

df = pd.DataFrame(data)

# Sort the dataframe based on the 'id' column
df = df.sort_values(by='id')

# Keep only the last 3 occurrences for each group of first_name, last_name, and sex
result_df = df.groupby(['first_name', 'last_name', 'sex']).tail(3)

# Reset the index if needed
result_df = result_df.reset_index(drop=True)

# Display the resulting dataframe
print(result_df)

字符串
它应该输出:

id first_name last_name   sex country
0   5       John       Doe  Male   Spain
1   6       Mark       Kay  Male  France
2   7       John       Doe  Male    Peru
3   8       Mark       Kay  Male   India
4   9       Mark       Kay  Male    Laos
5  10       John       Doe  Male   Benin

相关问题