我有像這樣的資料框
| 姓名 | 時間 | 法規 |
|---|---|---|
| 一個 | 1 | 在 |
| 一個 | 2 | 出去 |
| 一個 | 3 | 在 |
| 一個 | 4 | 出去 |
| 一個 | 5 | 在 |
| 乙 | 1 | 在 |
| 乙 | 4 | 在 |
| 乙 | 7 | 出去 |
| 乙 | 18 | 在 |
我只想為每個組最后一次獲得statut=“out”和之后的行。像這樣:
| 姓名 | 時間 | 法規 |
|---|---|---|
| 一個 | 4 | 出去 |
| 一個 | 5 | 在 |
| 乙 | 7 | 出去 |
| 乙 | 18 | 在 |
uj5u.com熱心網友回復:
這可以使用幾個視窗函式來完成。但是,使用視窗的功能并不是很簡單。
from pyspark.sql import functions as F, Window as W
df = spark.createDataFrame(
[('A', 1, 'in'),
('A', 2, 'out'),
('A', 3, 'in'),
('A', 4, 'out'),
('A', 5, 'in'),
('B', 1, 'in'),
('B', 4, 'in'),
('B', 7, 'out'),
('B', 18, 'in'),
('B', 19, 'in'),
('C', 1, 'in')],
['name', 'time', 'statut']
)
w_max_out = W.partitionBy('name').orderBy(F.col('statut') != 'out', F.desc('time'))
w_lead = W.partitionBy('name').orderBy(F.desc('time'))
df = df.withColumn('_lead', F.lead('time').over(w_lead))
df = df.withColumn('_max_out', F.max(F.when(F.col('statut') == 'out', F.col('time'))).over(w_max_out))
df = df.filter('(_max_out = time) or (_max_out = _lead)').drop('_max_out', '_lead')
結果:
df.show()
# ---- ---- ------
# |name|time|statut|
# ---- ---- ------
# | A| 4| out|
# | A| 5| in|
# | B| 7| out|
# | B| 18| in|
# ---- ---- ------
最后一個過濾器行之前的結果:
# ---- ---- ------ ----- --------
# |name|time|statut|_lead|_max_out|
# ---- ---- ------ ----- --------
# | A| 4| out| 3| 4|
# | A| 2| out| 1| 4|
# | A| 5| in| 4| 4|
# | A| 3| in| 2| 4|
# | A| 1| in| null| 4|
# | B| 7| out| 4| 7|
# | B| 19| in| 18| 7|
# | B| 18| in| 7| 7|
# | B| 4| in| 1| 7|
# | B| 1| in| null| 7|
# | C| 1| in| null| null|
# ---- ---- ------ ----- --------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/486892.html
