Python 如何添加dataframe中一列的字符串并形成另一列,该列将具有原始列的增量值

Python 如何添加dataframe中一列的字符串并形成另一列,该列将具有原始列的增量值,python,apache-spark,dataframe,pyspark,Python,Apache Spark,Dataframe,Pyspark,我有一个数据框,我正在将其数据粘贴到下面: +---------------+--------------+----------+------------+----------+ |name | DateTime| Seq|sessionCount|row_number| +---------------+--------------+----------+------------+----------+ | abc| 152157

我有一个数据框,我正在将其数据粘贴到下面:

+---------------+--------------+----------+------------+----------+
|name           |      DateTime|       Seq|sessionCount|row_number|
+---------------+--------------+----------+------------+----------+
|            abc| 1521572913344|        17|           5|         1|
|            xyz| 1521572916109|        17|           5|         2|
|           rafa| 1521572916118|        17|           5|         3|
|             {}| 1521572916129|        17|           5|         4|
|     experience| 1521572917816|        17|           5|         5|
+---------------+--------------+----------+------------+----------+
'name'
为字符串类型。我想要一个新的列
“effective\u name”
,它将包含
“name”
的增量值,如下所示:

+---------------+--------------+----------+------------+----------+-------------------------+
|name          | DateTime |sessionSeq|sessionCount|row_number |effective_name|
+---------------+--------------+----------+------------+----------+-------------------------+
|abc            |1521572913344 |17        |5           |1         |abc                      |
|xyz            |1521572916109 |17        |5           |2         |abcxyz                   |
|rafa           |1521572916118 |17        |5           |3         |abcxyzrafa               |
|{}             |1521572916129 |17        |5           |4         |abcxyzrafa{}             |
|experience     |1521572917816 |17        |5           |5         |abcxyzrafa{}experience   |
+---------------+--------------+----------+------------+----------+-------------------------+

新列包含以前的
name
列值的增量连接。

您可以通过使用按
clientDateTime
排序的

导入pyspark.sql.f函数
从pyspark.sql导入窗口
w=Window.orderBy(“DateTime”)#定义订购窗口
df.drop(“Seq”、“sessionCount”、“row_number”)。选择(
"*",
f、 海螺(
"",
f、 收集清单(f.col(“名称”))。超过(w)
).别名(“有效名称”)
).show(truncate=False)
#+---------------+--------------+-------------------------+
#|名称|日期时间|有效名称|
#+---------------+--------------+-------------------------+
#|abc | 1521572913344 | abc|
#|xyz | 1521572916109 | abcxyz|
#|拉法| 1521572916118 |阿布克谢拉法|
#|{}1521572916129{abcxyzrafa{}|
#|经验| 1521572917816 | abcxyzrafa{}经验|
#+---------------+--------------+-------------------------+
我删除了
“Seq”
“sessionCount”
“row\u number”
,以使输出显示更友好

如果需要对每个组执行此操作,可以在
窗口中添加一个
partitionBy
。假设在这种情况下,您希望按
会话eq
分组,您可以执行以下操作:

w=Window.partitionBy(“Seq”).orderBy(“DateTime”)
df.drop(“sessionCount”、“行号”)。选择(
"*",
f、 海螺(
"",
f、 收集清单(f.col(“名称”))。超过(w)
).别名(“有效名称”)
).show(truncate=False)
#+---------------+--------------+----------+-------------------------+
#|name | DateTime | sessionSeq | effective | u name|
#+---------------+--------------+----------+-------------------------+
#|abc | 1521572913344 | 17 | abc|
#|xyz | 1521572916109 | 17 | abcxyz|
#|拉法| 1521572916118 | 17 |阿布克谢拉法|
#|{}1521572916129{12417}abcxyzrafa{}|
#|经验| 1521572917816 | 17 | abcxyzrafa{}经验|
#+---------------+--------------+----------+-------------------------+
如果您更喜欢使用列
,则上述内容相当于:

df.drop(“sessionCount”,“行号”)。带列(
“有效名称”,
f、 海螺(
"",
f、 收集清单(f.col(“名称”))。超过(w)
)
).show(truncate=False)

解释

您希望在多行上应用函数,这称为聚合。对于任何聚合,都需要定义要聚合的行和顺序。我们使用
窗口
来实现这一点。在这种情况下,
w=Window.partitionBy(“Seq”).orderBy(“DateTime”)
将按
Seq
对数据进行分区,并按
DateTime
对数据进行排序

我们首先在窗口上应用聚合函数
collect\u list(“name”)
。这将收集
name
列中的所有值,并将它们放入列表中。插入顺序由窗口的顺序定义

例如,此步骤的中间输出为:

df.select(
f、 收集列表(“名称”)。在(w)上方。别名(“收集”)
).show()
#+--------------------------------+
#|收集|
#+--------------------------------+
#|[美国广播公司]|
#|[abc,xyz]|
#|[abc、xyz、拉法]|
#|[abc,xyz,拉法,{}]|
#|[abc,xyz,拉法,{},经验]|
#+--------------------------------+
现在列表中已经有了相应的值,我们可以用一个空字符串作为分隔符将它们连接在一起

df.select(
f、 海螺(
"",
f、 收集清单(“名称”)。超过(w)
).别名(“连接”)
).show()
#+-----------------------+
#|串联|
#+-----------------------+
#|abc|
#|abcxyz|
#|阿布克谢拉法|
#|abcxyzrafa{}|
#|abcxyzrafa{}经验|
#+-----------------------+

解决方案:

导入pyspark.sql.f函数

w=Window.partitionBy(“Seq”).orderBy(“DateTime”)

选择( "*", f、 海螺( "", f、 集合(f.col(“名称”))。在(w)上方 ).别名(“姓名”) ).show()

解释

collect_set()-此函数返回类似[[“abc”、“xyz”、“rafa”、{}、“experience”]的值

concat_ws()-此函数将collect_set()的输出作为输入,并将其转换为abc、xyz、rafa、{}、experience

注意:
如果没有重复项,请使用collect_set(),否则请使用collect_list()

您是按
clientDateTime
还是按
行数
排序的?任何
groupBy()
s?@Chaitanya我回滚了您的编辑。不要发帖。到目前为止你做了什么?@pault-数据是dummy@AshishAcharya我正在尝试使用lag函数进行连接,感谢Pault…sessionSeq在我将要编写的最后一个数据帧中是必需的。我将删除另外两列。。我可以在窗口选项中使用PartitionBy(“sessionSeq”)吗?因为我只需要在特定的情况下使用它sessionSeq@ChaitanyaKirty是的,你能做到。我编辑了答案以展示一个例子。我需要数据框中的新列“有效功能切换”。我是否应该使用df.withColumn()选项?您可以执行-
df=df。选择(“*”,…)
df=df.withColumn(…)
。我将