Pandas/Pyspark 增加显示重复值的条件栏

0 人关注

如果我想在我的数据框架中添加一列,以标记是否满足条件,但我不知道如何解决这个问题。

假设我们有相同名字的学生,在数据框架上,但我想只在他们的成绩超过5分的时候标记他们,而忽略成绩低于5分的学生。

Like this :

Before:

https://i.stack.imgur.com/mpI1L.png

https://i.stack.imgur.com/qPOEp.png

我可以使用Pandas或Pyspark作为库。

python
pandas
dataframe
pyspark
indritkalaj
indritkalaj
发布于 2022-07-27
2 个回答
samkart
samkart
发布于 2022-07-27
已采纳
0 人赞同

首先,你要计算一个 name + surname 的分数是否超过5。这可以通过计算该 name + surname 的最大分数来完成。利用这些信息,根据条件对记录进行标记。

data_sdf. \
    withColumn('name_max_mark', func.max('mark').over(wd.partitionBy('name', 'surname'))). \
    withColumn('dup_name', (func.col('name_max_mark') >= 5)). \
    show()
# +----+-------+----+-------------+--------+
# |name|surname|mark|name_max_mark|dup_name|
# +----+-------+----+-------------+--------+
# |Mark|    Doe|   3|            3|   false|
# |Mark|    Doe|   1|            3|   false|
# | Tom|    Doe|   6|            6|    true|
# | Tom|    Doe|   2|            6|    true|
# +----+-------+----+-------------+--------+

select()只有你需要的列,即放弃name_max_mark而存储到一个变量。

srinath
srinath
发布于 2022-07-27
0 人赞同

Input:

df = pd.DataFrame({
    "Name": ["Tom", "Mark", "Tom", "Mark", "Jim", "Jim"],
    "Surname": ["Doe"] * 6,
    "Mark": [6, 3, 2, 1, 2, 3]

标记数值大于5的行

df.loc[:, "Duplicated_Name"]  = (df.Mark > 5)

如果有一行大于5,则将其他的Duplicated_Name标记为True

df.loc[df.Name.isin(df.loc[df["Duplicated_Name"] ==True, "Name"]), "Duplicated_Name"] = True

Result

   Name Surname  Mark   Duplicated_Name
0   Tom     Doe     6   True
1  Mark     Doe     3  False