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(…)
。我将