我得到了一個資料框架(df1),其中我列出了一些時間框架:
| start | end | event name||
|-------|-----|------------|
| 1 | 3 | name_1 !
| 3 | 5 | name_2 |
| 2 | 6 | name_3 |
在這些時間框架中,我想從另一個資料框架(df2)提取一些資料。例如,我想在指定的時間范圍內用df2的平均測量值來擴展df1。
| timestamp | measuring ||
|-----------|-------------|
| 1 | 5 !
2 | 7 !
| 3 | 5 !
| 4 | 9 !
| 5 | 2 | 2 |
| 6 | 7 !
| 7 | 8 !
我在考慮一個UDF函式,通過時間戳過濾df2并評估平均值。但是在一個UDF中我不能參考兩個資料幀:
def get_avg(start, end)。
return df2.filter(df2.timestamp > start & df2.timestamp < end).agg({"average"/span>: "avg"})
udf_1 = f.udf(get_avg)
df1.select(udf_1('start', 'end') 。
這將拋出一個錯誤TypeError: cannot pickle '_thread.RLock' object。
我將如何有效地解決這個問題?
uj5u.com熱心網友回復:
在這種情況下,沒有必要使用UDFs,你可以簡單地使用join在一個由時間戳決定的范圍區間內
import pyspark.sql.function as F
df1.join(df2, on=[(df2.timestamp > df1.start) & (df2.timestamp < df1.end)])
.groupby('start'/span>, 'end'/span>, 'event_name'/span>)
.agg(F.mean('measurement').alias('avg')
.顯示()
----- --- ---------- -----------------
|開始|結束|event_name| avg|
----- --- ---------- -----------------
| 1| 3| name_1| 7.0|
3| 5| name_2| 9.0|
2| 6| name_3| 5.333333333|
----- --- ---------- -----------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/326401.html
標籤:
上一篇:Python。將Dataframe元素轉換為帶有位置的ID(名稱)列
下一篇:在pandas列中尋找某個短語
