如何在 Pyspark 中的数据帧上查找不同组的不同值并重新编码数据帧



>我有一个大数据框,数据帧包含名为"groups"的变量中的标志人员组。

我现在需要为这个数据帧做的是以更有意义的方式呈现。

例如,在下面的组 148 中,下表如下:

df.select('gender','postcode','age','groups','bought').filter(df.groups==148).show()   
+------+--------+---+----------+----------+
|gender|postcode|age|    groups|bought    |
+------+--------+---+----------+----------+
|     0|    2189| 25|       148|car       |
|     0|    2192| 34|       148|house     |
|     1|    2193| 37|       148|car       |
|     1|    2194| 38|       148|house     |
|     1|    2196| 54|       148|laptop    |
|     1|    2197| 27|       148|laptop    |
|     0|    2198| 44|       148|laptop    |
+------+--------+---+----------+----------+

性别有0,1,所以这个群体中的所有这些人,都会被改成"人" 如果全部为 1,则为女性,如果全部为 0,则为男性。规则,但不适用于此组。

现在邮政编码,最低是 2189,最高是 2211,然后每个案例将更改为 [2189 - 2198]。

对于年龄,最低是18岁,最高是62岁,所以将是 [25-54]

对于购买,我需要检查已购买的物品,这些是[汽车,房屋,笔记本电脑]

因此,此组重新编码最终将变为:

+------+-------------+--------+----------+------------------+
|gender|     postcode|     age|    groups|        bought    |
+------+-------------+--------+----------+------------------+
|person|[2189 - 2198]| [25-54]|       148|[car,house,laptop]|
|person|[2189 - 2198]| [25-54]|       148|[car,house,laptop]|
|person|[2189 - 2198]| [25-54]|       148|[car,house,laptop]|
|person|[2189 - 2198]| [25-54]|       148|[car,house,laptop]|
|person|[2189 - 2198]| [25-54]|       148|[car,house,laptop]|
|person|[2189 - 2198]| [25-54]|       148|[car,house,laptop]|
|person|[2189 - 2198]| [25-54]|       148|[car,house,laptop]|
+------+-------------+--------+----------+------------------+

这将对数据帧中的所有组完成。

有什么想法吗? 在这里我发现了类似的东西,但在 scala 中 提前谢谢你!

希望这有帮助!

import pyspark.sql.functions as f
from pyspark.sql.types import StringType
df = sc.parallelize([
[0, 2189, 25, 148, 'car'],
[0, 2192, 34, 148, 'house'],
[1, 2193, 37, 148, 'car'],
[1, 2194, 38, 148, 'house'],
[1, 2196, 54, 148, 'laptop'],
[1, 2197, 27, 148, 'laptop'],
[0, 2198, 44, 148, 'laptop']
]).toDF(('gender', 'postcode', 'age', 'groups', 'bought'))
df.show()
df1 = df.groupBy("groups").agg(f.collect_set("bought")).withColumnRenamed("collect_set(bought)","bought")
df2 = df.groupBy("groups").agg(f.min("age"), f.max("age")). 
withColumn("age", f.concat(f.col("min(age)"), f.lit("-"), f.col("max(age)"))).select("groups","age")
df3 = df.groupBy("groups").agg(f.min("postcode"), f.max("postcode")). 
withColumn("postcode", f.concat(f.col("min(postcode)"), f.lit("-"), f.col("max(postcode)"))).select("groups","postcode")
def modify_values(l):
if l == [0, 1]:
return "person"
else:
if l == [0]:
return "male"
else:
return "female"
modified_val = f.udf(modify_values, StringType())
df4 = df.groupBy("groups").agg(f.collect_set("gender")).withColumn("gender",modified_val("collect_set(gender)")).select("groups","gender")
merged_df = df1.join(df2, "groups").join(df3, "groups").join(df4, "groups")
merged_df.show()

输出为:

+------+--------------------+-----+---------+------+
|groups|              bought|  age| postcode|gender|
+------+--------------------+-----+---------+------+
|   148|[laptop, house, car]|25-54|2189-2198|person|
+------+--------------------+-----+---------+------+


不要忘记让我们知道它是否解决了您的问题

最新更新