根据另一列中的值将 PySpark 数据帧列转换为 Python 列表

时间:2021-03-03 12:26:43

标签: python pandas apache-spark pyspark

我有一个包含 2 列的数据框“dfClean”:

+---+-----+
|som| ano |
+---+-----+
| 1 |  1  |
| 2 |  0  |
| 3 |  1  |
| 4 |  1  |

我需要创建一个 Python 列表,其中“som”中的那些值在同一行的“ano”列中具有 1。 所以预期输出是: pyLst = [1,3,4]

在 Pandas 中我使用过: pyLst = dfClean.som[dfClean.ano == 1].tolist()

如何在 PySpark 或 Scala 中执行此操作以及我需要导入哪些其他库?

3 个答案:

答案 0 :(得分:1)

可以先进行过滤,然后选择som列,将行收集到Python列表中,然后从每一行中获取元素:

pyLst = [r[0] for r in df.filter(df.ano == 1).select('som').collect()]

print(pyLst)
[1, 3, 4]

另一种方法是先转换为熊猫数据帧,然后像您在问题中所做的那样调用 .tolist()

pyLst = df.filter(df.ano == 1).select('som').toPandas()['som'].tolist()

您也可以使用 RDD API:

pyLst = df.filter(df.ano == 1).select('som').rdd.map(lambda r: r[0]).collect()

答案 1 :(得分:0)

您可以使用过滤器,然后仅将所需列收集为 rdd,然后转换为列表。您可以使用列表理解来执行此操作。

它看起来像这样,

lst = [row[0] for row in sdf.filter("ano = 1").select('som').collect()]

答案 2 :(得分:0)

您可以执行 groupby 并使用 spark 的 collect_list 函数

import pyspark.sql.functions as F   
df = spark.createDataFrame([(1, 1), (2, 0), (3, 1), (4, 1), ], ['som', 'ano'])
pyLst = df.groupby('ano').agg(F.collect_list('som').alias('pyLst')).where('ano = 1').collect()[0]['pyLst']