python - [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_1、df_variables_2、marche_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
提前感谢您的帮助,这真的意味着我已经做了一个多星期了!如果我想要做的事情不清楚,请告诉我(如果你愿意的话,它或多或少是一个有条件的联合......)
解决方案
推荐阅读
- data-binding - 如何正确地将表单元素绑定到 SAPUI5 中新创建的 oData 实体?
- menu - 如何在同一行制作徽标和菜单
- jupyter-notebook - 如何在启动它的单元格中打印 jupyter 后台作业输出?
- html - 输入时如何选择兄弟 ::after 伪元素:焦点
- reactjs - React Router 改变了 url 但不加载组件
- sql-server - 尝试在 sql 测试脚本中参数化数据库
- python - 如何用乌龟在python中创建分形螺旋?
- r - 打开用 r 编写的文件时,excel 和 pc 卡住并出现错误
- oracle - 如何查询 ipv6 范围内的十六进制/原始数据
- java - 是否可以在 Saxon 中缓存 XML 文档以避免重新解析和重新索引?