我有一个包含 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 中执行此操作以及我需要导入哪些其他库?
答案 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']