首页 > 解决方案 > [Python][Pandas] 高效交叉比较两个groupby列中的值

问题描述

我目前正在尝试交叉两个数据框(df 和 marche_type_jointure)的数据,这些数据是关于按某些列(英文:stop, direction, type of day, season, year)分组的巴士旅程,如下面的代码所示:

df_grouped = df.groupby(['arret', 'sens', 'type_jour','saison', 'annee'])
marche_type_jointure_grouped = marche_type_jointure.groupby(['arret', 'sens', 'type_jour','saison', 'annee'])

这为我提供了以下数据框以及以下相关列(请参见屏幕截图df_variables_1df_variables_2marche_type_variables),您可以使用以下数据框作为示例(只有您可以看到的最重要的变量):

df_jointure = pd.DataFrame([
['Aller','VIG01A' , time(7,21,28),'vac_s' ,'hiver' ,1978 , 'NaN' ], 
['Aller','VIG01A' , time(18,7,35),'vac_s' ,'hiver' ,1978 , 'NaN' ], 
['Aller','LYC30R' , time(7,21,54),'vac_s' ,'hiver' ,1978 , 'NaN' ], 
['Aller','LYC30R' , time(14,43,42),'vac_s' ,'hiver' ,1978 , 'NaN' ] ], columns=['sens', 'arret', 'heure_arrivee_reelle', 'type_jour', 'saison', 'annee', 'temps_trajet_mt'])


marche_type_jointure = df = pd.DataFrame([
['VIG01A', time(6,0,0), time(6,29,0), 'hiver', 'Aller', 4, 'vac_s', 1978],
['VIG01A', time(7,0,0), time(7,29,0), 'hiver', 'Aller', 4, 'vac_s', 1978], 
['VIG01A', time(7,0,0), time(7,59,0), 'hiver', 'Aller', 4, 'vac_s', 1978], 
['VIG01A', time(18,30,0), time(18,59,0), 'hiver', 'Aller', 4, 'vac_s', 1978], 
['LYC30R', time(6,0,0), time(6,29,0), 'hiver', 'Aller', 1, 'semaine', 1978], 
['LYC30R', time(7,45,0), time(7,59,0), 'hiver', 'Aller', 1, 'semaine', 1978],
['LYC30R', time(9,30,0), time(15,59,00), 'hiver', 'Aller', 1, 'semaine', 1978]], 
columns=['arret', 'heure_debut_periode', 'heure_fin_periode', 'saison', 'sens', 'temps_trajet_sur_periode', 'type_jour', 'annee])

这里也是最重要的变量:在 df 中:('sens'第 6 列), 'arret'停止,第 9 列), 'heure_arrivee_reelle'(实际到达时间(公共汽车),第 13 列), 'type_jour'日期类型,'vac_s' 表示假期, 'samedi' 代表星期六, 'dimanche' 代表星期天, 最后是 'semaine' 代表星期, 第 25 列), 'saison'(这是季节: 'hiver' 代表冬天或 'ete' 代表夏天, 第 26 列), 'annee'(即 2018 年或 1978 年,即 2017-2018 年冬季,即 2017 年 1 月至 2017 年 5 月,然后 2017 年 9 月至 2018 年 5 月,第 29 列),' temps_trajet_mt' 目前为空,但值将来自 'marche_type_jointure_grouped'(.temps_trajet_sur_periode)。

对于marche_type_jointure_grouped:('arret' 停止),'heure_debut_periode'哪些'heure_fin_periode'是某个时间段的开始和结束,其中有某个时间段是'temps_trajet_sur_periode'从上一站到我们所在的(在公交线路中)所需的时间. 'type_jour','saison''sens'中的相同df_grouped

我实际上想要做的是,对于分组数据帧的每个“键”(停止、方向、日期类型、季节和年份),将值'heure_arrivee_reelle'(英文中的“ actual_time_of_arrival ”)df_grouped'heure_fin_periode'( ' end_time_period ' 英文)和/或'heure_debut_periode'(' starting_time_period ' 遵循此条件:'if heure_arrivee_reelle in [heure_debut_periode, heure_fin_periode]'(作为间隔,但可能有一个更简单的条件给出相同的结果)then the value of temps_trajet_mt in df_grouped becomes the corresponding value of temps_trajet_sur_periode in marche_type_jointure_grouped。显然我正在寻找以有效的方式做到这一点。这就是我试图做的事情,这样也许你会更多地理解我想要做的事情:

for key,group in df_grouped:
df_mt = marche_type_jointure_grouped.get_group(key) #we take the corresponding group from the other dataframe
index_har = list(group.heure_arrivee_reelle.index.values) #list of index of actual arrival times from df_grouped referring to key
index_hdp = list(df_mt.heure_debut_periode.index.values) #list of index of beginning time of period from marche_type_jointure_grouped refering to key
for i in index_hdp:
    for j in index_har:
        if df_mt.heure_fin_periode[i] >= group.heure_arrivee_reelle[j]:
            group.temps_trajet_mt[j] = df_mt.temps_trajet_sur_periode[i]
            index_har.remove(j) #so that I do not have to compare it again
        else:
            pass
df_grouped.size().unstack() #so that I can see the result

提前感谢您的帮助,这真的意味着我已经做了一个多星期了!如果我想要做的事情不清楚,请告诉我(如果你愿意的话,它或多或少是一个有条件的联合......)

标签: pythonpandaspandas-groupby

解决方案


推荐阅读