我有一個時間序列資料框,我使用以下代碼計算每個月的天數:
count_dates=df_inner.groupBy('dates').count().orderBy('dates')
此代碼為我提供了一個包含 1 列的新資料框:
dates count
2021-03-01 5
2021-03-02 44
2021-03-03 3
2021-03-04 2
2021-03-05 1
這是另一個資料框:
name 2021-03-01 2021-03-02 2021-03-03 2021-03-04 2021-03-05
A 40 42 30 1 8
B 80 3 54 2 7
C 10 0 52 2 8
換句話說,第一個資料集中的每個日期都是另一個資料集中的一列。如何將第二個資料框的每一列與count
第一個 df 的列分開?
輸出:
name 2021-03-01 2021-03-02 2021-03-03 2021-03-04 2021-03-05
A 40/5 42/44 30/3 1/2 8/5
B 80/5 3/44 54/3 2/2 7/5
C 10/5 0/44 52/3 2/2 8/5
uj5u.com熱心網友回復:
試試下面的。
示例 dfs:
from pyspark.sql import SparkSession, functions as F
spark = SparkSession.builder.getOrCreate()
df1 = spark.createDataFrame(
[('2021-03-01', 5),
('2021-03-02', 44),
('2021-03-03', 3),
('2021-03-04', 2),
('2021-03-05', 1)],
['dates', 'count']
)
df2 = spark.createDataFrame(
[('A', 40, 42, 30, 1, 8),
('B', 80, 3, 54, 2, 7),
('C', 10, 0, 52, 2, 8)],
['name', '2021-03-01', '2021-03-02', '2021-03-03', '2021-03-04', '2021-03-05']
)
腳本:
# Unpivoting df2
cols_to_unpivot = [f"`{c}`, \'{c}\'" for c in df2.columns if c != 'name']
stack_string = ', '.join(cols_to_unpivot)
df2 = df2.select(
'name',
F.expr(f'stack({len(cols_to_unpivot)}, {stack_string}) as (val, dates)')
)
# Joining
df_joined = df2.join(df1, 'dates', 'full')
# Pivoting the result
df = df_joined.groupBy('name').pivot('dates').agg(F.first(F.col('val') / F.col('count')))
df.show()
# ---- ---------- ------------------- ------------------ ---------- ----------
# |name|2021-03-01| 2021-03-02| 2021-03-03|2021-03-04|2021-03-05|
# ---- ---------- ------------------- ------------------ ---------- ----------
# | B| 16.0|0.06818181818181818| 18.0| 1.0| 7.0|
# | C| 2.0| 0.0|17.333333333333332| 1.0| 8.0|
# | A| 8.0| 0.9545454545454546| 10.0| 0.5| 8.0|
# ---- ---------- ------------------- ------------------ ---------- ----------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470823.html
標籤:阿帕奇火花 日期 pyspark apache-spark-sql 划分
上一篇:找到最好的時間改變最少的其他時間