python - 用数据框中的位置替换数组中的元素 - Pyspark
问题描述
我有一个数据框:
|ID|CTA|
|------|
|11|1 |
|11|2 |
|11|7 |
|45|7 |
我需要按 ID 分组,并且每个 ID 的 ARRAY 长度为 7,但在 CTA 中有位置时指示 1
所以我的输出数据框应该如下所示:
|ID|CTAS |
|------------------- |
|11|[1,1,0,0,0,0,1] |
|45|[0,0,0,0,0,0,1] |
你能帮助我吗?
更新:
如何将零留在数组中?
解决方案
您可以应用TRANSFORM
表达式并迭代sequence(1, 7)
以检查该值是否包含在 CTAS 列中:
import pyspark.sql.functions as f
group_df = (df
.groupBy('ID')
.agg(f.collect_list('CTA').alias('CTAS')))
# +---+---------+
# |ID |CTAS |
# +---+---------+
# |11 |[1, 2, 7]|
# |45 |[7] |
# +---+---------+
pos_df = (group_df
.withColumn('CTAS',
f.expr('transform(sequence(1, 7), value -> cast(array_contains(CTAS, value) as int))')))
pos_df.sort('ID').show(truncate=False)
# +---+---------------------+
# |ID |CTAS |
# +---+---------------------+
# |11 |[1, 1, 0, 0, 0, 0, 1]|
# |45 |[0, 0, 0, 0, 0, 0, 1]|
# +---+---------------------+
推荐阅读
- python - Pandas:生成时间序列日期时间特征
- tsql - 在 T-SQL 中可能使用更优雅的语句而不是子选择
- android - E/Volley:[2458] NetworkDispatcher.processRequest:未处理的异常 java.lang.RuntimeException:错误的 URL
- c# - 确定极坐标图 Y 轴最大值的算法
- javascript - PhantomJS 没有足够的时间加载整个页面
- python - 寻找一个可以帮助我避免重复到文本文件中的函数
- c++ - 如何在 CCombobox::AddString() 中设置 unicode 文本而不用 unicode 编译整个 c++ 项目?
- javascript - 按字母顺序对页面上的元素进行排序
- hybris - 将表单数据从 Spartacus Storefront 发送到 Hybris 后端控制器
- c# - .NET Core 库未读取配置文件