python—根据间隔中的记录数递增列

kzipqqlq  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(266)

我有一个数据框,如下所示 pyspark ```
df = sqlContext.createDataFrame(
[(1,'Y','Y',0,0,0,2,'Y','N','Y','Y'),
(2,'N','Y',2,1,2,3,'N','Y','Y','N'),
(3,'Y','N',3,1,0,0,'N','N','N','N'),
(4,'N','Y',5,0,1,0,'N','N','N','Y'),
(5,'Y','N',2,2,0,1,'Y','N','N','Y'),
(6,'Y','Y',0,0,3,6,'Y','N','Y','N'),
(7,'N','N',1,1,3,4,'N','Y','N','Y')
],
('id', 'compatible', 'product', 'ios', 'pc', 'other', 'devices', 'customer', 'subscriber', 'circle', 'smb')
)

df.show()

+---+----------+-------+---+---+-----+-------+--------+----------+------+---+
| id|compatible|product|ios| pc|other|devices|customer|subscriber|circle|smb|
+---+----------+-------+---+---+-----+-------+--------+----------+------+---+
| 1| Y| Y| 0| 0| 0| 2| Y| N| Y| Y|
| 2| N| Y| 2| 1| 2| 3| N| Y| Y| N|
| 3| Y| N| 3| 1| 0| 0| N| N| N| N|
| 4| N| Y| 5| 0| 1| 0| N| N| N| Y|
| 5| Y| N| 2| 2| 0| 1| Y| N| N| Y|
| 6| Y| Y| 0| 0| 3| 6| Y| N| Y| N|
| 7| N| N| 1| 1| 3| 4| N| Y| N| Y|
+---+----------+-------+---+---+-----+-------+--------+----------+------+---+

现在我想创建一个新列 `p_no` 在Dataframe中,为一组记录指定相同的值。例如,两个记录是一个组
我的意思是我想赋值 `0` 到前两个记录并按 `1` 接下来的两张唱片等等
预期结果:

+---+----------+-------+---+---+-----+-------+--------+----------+------+---+----+
| id|compatible|product|ios| pc|other|devices|customer|subscriber|circle|smb|p_no|
+---+----------+-------+---+---+-----+-------+--------+----------+------+---+----+
| 1| Y| Y| 0| 0| 0| 2| Y| N| Y| Y| 1|
| 2| N| Y| 2| 1| 2| 3| N| Y| Y| N| 1|
| 3| Y| N| 3| 1| 0| 0| N| N| N| N| 2|
| 4| N| Y| 5| 0| 1| 0| N| N| N| Y| 2|
| 5| Y| N| 2| 2| 0| 1| Y| N| N| Y| 3|
| 6| Y| Y| 0| 0| 3| 6| Y| N| Y| N| 3|
| 7| N| N| 1| 1| 3| 4| N| Y| N| Y| 4|
+---+----------+-------+---+---+-----+-------+--------+----------+------+---+----+

我申请了 `row_number` 功能如下

import pyspark.sql.functions as f
from pyspark.sql import Window

df1 = df.withColumn("p_no",f.row_number().over(Window.partitionBy()))

输出低于

df1.show()

+---+----------+-------+---+---+-----+-------+--------+----------+------+---+----+
| id|compatible|product|ios| pc|other|devices|customer|subscriber|circle|smb|p_no|
+---+----------+-------+---+---+-----+-------+--------+----------+------+---+----+
| 1| Y| Y| 0| 0| 0| 2| Y| N| Y| Y| 1|
| 2| N| Y| 2| 1| 2| 3| N| Y| Y| N| 2|
| 3| Y| N| 3| 1| 0| 0| N| N| N| N| 3|
| 4| N| Y| 5| 0| 1| 0| N| N| N| Y| 4|
| 5| Y| N| 2| 2| 0| 1| Y| N| N| Y| 5|
| 6| Y| Y| 0| 0| 3| 6| Y| N| Y| N| 6|
| 7| N| N| 1| 1| 3| 4| N| Y| N| Y| 7|
| 8| Y| Y| 1| 1| 2| 0| Y| Y| N| N| 8|
+---+----------+-------+---+---+-----+-------+--------+----------+------+---+----+

我不知道我需要做什么。我怎样才能达到我想要的
au9on6nz

au9on6nz1#

将行号四舍五入除以2即可:

df2 = df.withColumn(
    "p_no",
    f.round(f.row_number().over(Window.orderBy(f.lit(None)))/2).cast('int')
)

df2.show()
+---+----------+-------+---+---+-----+-------+--------+----------+------+---+----+
| id|compatible|product|ios| pc|other|devices|customer|subscriber|circle|smb|p_no|
+---+----------+-------+---+---+-----+-------+--------+----------+------+---+----+
|  1|         Y|      Y|  0|  0|    0|      2|       Y|         N|     Y|  Y|   1|
|  2|         N|      Y|  2|  1|    2|      3|       N|         Y|     Y|  N|   1|
|  3|         Y|      N|  3|  1|    0|      0|       N|         N|     N|  N|   2|
|  4|         N|      Y|  5|  0|    1|      0|       N|         N|     N|  Y|   2|
|  5|         Y|      N|  2|  2|    0|      1|       Y|         N|     N|  Y|   3|
|  6|         Y|      Y|  0|  0|    3|      6|       Y|         N|     Y|  N|   3|
|  7|         N|      N|  1|  1|    3|      4|       N|         Y|     N|  Y|   4|
+---+----------+-------+---+---+-----+-------+--------+----------+------+---+----+

或者,如果id是连续的,可以将id除以2取整。

相关问题