我有這個資料框:
| ID | 分鐘 | 識別符號 |
|---|---|---|
| 啊 | 1 | 1 |
| 啊 | 1 | 2 |
| 啊 | 1 | 3 |
| 啊 | 2(忽略) | 4 |
| 啊 | 1 | 5 |
| 啊 | 1 | 6 |
| bb | 1 | 7 |
| bb | 1 | 8 |
| bb | 5(忽略) | 9 |
| bb | 1 | 10 |
我想要的輸出按“Id”分組,但總和連續的“分鐘”(僅當它們 = 1 時):
| ID | 分鐘 |
|---|---|
| 啊 | 3 |
| 啊 | 2 |
| bb | 2 |
| bb | 1 |
uj5u.com熱心網友回復:
可以使用視窗函式來完成。它們必須使用兩次:為分組創建幫助列,然后創建組。然后,根據創建的組對行進行分組。
輸入:
from pyspark.sql import functions as F, Window as W
df = spark.createDataFrame(
[('aa', 1, 1),
('aa', 1, 2),
('aa', 1, 3),
('aa', 2, 4),
('aa', 1, 5),
('aa', 1, 6),
('bb', 1, 7),
('bb', 1, 8),
('bb', 5, 9),
('bb', 1, 10)],
['Id', 'Minute', 'identifier'])
腳本:
w = W.partitionBy('Id').orderBy('identifier')
df = df.withColumn('_flg', F.coalesce(F.when(F.lag("Minute").over(w) != F.col("Minute"), 1), F.lit(0)))
df = df.withColumn('_grp', F.sum('_flg').over(w))
df = (df
.filter(F.col('Minute') == 1)
.groupBy('Id', '_grp')
.agg(F.count(F.lit(1)).alias('Minute'))
.drop('_grp')
)
df.show()
# --- ------
# | Id|Minute|
# --- ------
# | aa| 3|
# | aa| 2|
# | bb| 2|
# | bb| 1|
# --- ------
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/518675.html
