我有两个不同的数据帧,分别称为df和cr,分别具有不同的列和行内容,如下所示。我试图查找在cr数据框中显示的安装和撤消日期之间,给定机队类型在给定路线上发生的航班数量,并使用该总和创建一个新列。 df数据框包含所需的车队,日期,路线和计数信息。我设想需要从cr的每一行中包含的信息中过滤df。过滤将按照机队,路线和包含日期范围进行。过滤df后,将对路由计数求和,并将其放入cr中给定行的新列中,然后移至下一行。我通常会使用for循环在python中执行此操作,但是我的数据帧很大,在Pyspark中循环很繁琐。
我当前的尝试:
def component_route_normalized(component_route_count, fleet_month_year_count):
cr=component_route_count
df=fleet_month_year_count
temp=df.filter(
F.col('month-year').between(pd.to_datetime(cr.date_installed),pd.to_datetime(cr.date_removed)) &
F.col('route') == cr.route &
F.col('fleet_type') == cr.fmis_fleet_type_code
)
cr=cr.withColumn('fleet_route_count', F.sum(temp.route_count))
return cr
cr数据框内容示例:
+-----------+----------------------+------------------------+------------+-------+-------------+---------+-------+--------------------+--------------+------------+
|aircraft_id|nca_part_number_sse001|nca_serial_number_sse001|repair_cycle| route|part__routing|departure|arrival|fmis_fleet_type_code|date_installed|date_removed|
+-----------+----------------------+------------------------+------------+-------+-------------+---------+-------+--------------------+--------------+------------+
| 1| 25-3246-9-0001| 341| 8|PVG-EWR| 13| PVG| EWR| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|EWR-TLV| 34| EWR| TLV| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|CDG-EWR| 4| CDG| EWR| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|DEL-EWR| 16| DEL| EWR| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|EWR-MXP| 3| EWR| MXP| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|EWR-LHR| 7| EWR| LHR| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|TLV-EWR| 34| TLV| EWR| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|NRT-IAH| 15| NRT| IAH| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|IAH-FRA| 5| IAH| FRA| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|EWR-CDG| 4| EWR| CDG| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|BRU-EWR| 8| BRU| EWR| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|NRT-EWR| 17| NRT| EWR| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|FRA-EWR| 11| FRA| EWR| 777| 2014-12-16| 2015-12-10|
| 1| 25-3246-9-0001| 341| 8|EWR-PVG| 14| EWR| PVG| 777| 2014-12-16| 2015-12-10|
+-----------+----------------------+------------------------+------------+-------+-------------+---------+-------+--------------------+--------------+------------+
df数据帧内容的示例:
+----------+-------+----------+-----------+------------+-----------+
|month-year| route|fleet_type|route_count|flight_month|flight_year|
+----------+-------+----------+-----------+------------+-----------+
| 6/1/2014|PHL-ORD| 737| 92| 6| 2014|
| 4/1/2014|IAH-TUL| 787| 23| 4| 2014|
| 4/1/2014|DFW-ORD| 737| 86| 4| 2014|
| 5/1/2014|BRO-IAH| 737| 33| 5| 2014|
| 4/1/2014|YQR-ORD| 787| 9| 4| 2014|
| 3/1/2014|SFO-IAH| 757| 58| 3| 2014|
| 4/1/2014|AUS-IAH| BUS| 55| 4| 2014|
| 5/1/2014|AGU-IAH| 787| 1| 5| 2014|
+----------+-------+----------+-----------+------------+-----------+
答案 0 :(得分:0)
在机队类型,日期范围和路线上先加上join
和groupBy
,然后执行count
。您可以尝试这样的操作(可能需要对列类型进行调整):
cond = (F.col('cr.month-year').between(F.col('df.date_installed',F.col('df.date_removed')) &
(F.col('df.route') == F.col('cr.route')) &
(F.col('df.fleet_type') == F.col('cr.fmis_fleet_type_code')))
joined = cr.alias('cr').join(df.alias('df'), on=cond, how='inner')
counts = joined.groupBy(*cr.columns).agg(F.sum('route_count').alias('total_route_count'))