[Python][Pandas]高效地交叉和比较两个groupby列中的值

2024-05-15 01:06:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试交叉两个数据帧(df和marche\u type\u 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'(第26列中的“季节”是冬季的“hiver”或夏季的“ete”), 'annee'(即2018年或1978年,指2017-2018年冬季,即2017年1月至2017年5月,然后2017年9月至2018年5月,第29栏), “temps\u trajet\u mt”暂时为空,但值将来自“marche\u type\u jointure\u group”(.temps\u trajet\u sur periode)。你知道吗

对于marche类型的连接,分组为:'arret'(站)、'heure_debut_periode''heure_fin_periode',这是一段时间的开始和结束,在这段时间内有一个'temps_trajet_sur_periode',这是从上一站到我们所处的站(在公交线路上)所需的时间。'type_jour''saison''sens'df_grouped相同。你知道吗

我实际上想做的是,对于分组数据帧的每个“键”(停止、方向、日期类型、季节和年份),将df_grouped中的值'heure_arrivee_reelle'('英语中的实际到达时间')与'heure_fin_periode'('英语中的结束时间')和/或'heure_debut_periode'('开始时间'的不同值进行比较: “如果heure\u arrivee\u reelle in[heure\u defirst\u periode,heure\u fin\u 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

事先谢谢你的帮助,这真的很重要,我已经在这一个多星期了!请告诉我,如果我想做的是不清楚(这或多或少是一个有条件的联合,如果你愿意…)


Tags: ofdfindextimetypevacgroupedtemps

热门问题