python - 在 Pandas 中计算来自 2 个数据帧(由索引链接)的数据出现次数
问题描述
我有 2 个大型数据框(以下只是摘录),其中包含有关道路事故的信息,其中df_veh
包含有关车辆的详细信息并df_ped
包含每次事故中涉及的行人数量。veh_type
显示事故中涉及的车辆类型(1=自行车,2=汽车,3=公共汽车)。它们与acc_index
指示独特的事故有关。
veh_data = {'acc_index': ['001', '002', '002', '003', '003', '004', '005', '005', '006',
'006', '007', '007', '008', '008', '008', '009', '009', '009'],
'veh_type': ['1', '1', '2', '1', '1', '1', '2', '2', '2', '3', '1', '2', '1', '1',
'1', '1', '2', '2'] }
df_veh = pd.DataFrame (veh_data, columns = ['acc_index', 'veh_type'])
ped_data = {'acc_index': ['001', '002', '003', '004', '005', '006', '007', '008', '009'],
'pedestrians': ['1', '2', '0', '1', '4', '3', '0', '1', '2'] }
df_ped = pd.DataFrame (ped_data, columns = ['acc_index', 'pedestrians'])
我想要做的是计算事故数量(仅通过acc_index
唯一一次):
- 汽车和自行车之间(
veh_type==1
和veh_type==2
) - 自行车和行人之间(
veh_type==1
和pedestrians>=1
) - 汽车和行人之间(
veh_type==2
和pedestrians>=1
) - 仅在汽车之间(
veh_type==2
对于相同的 acc_index) - 仅在自行车之间(
veh_type==1
对于相同的 acc_index) - 仅行人之间(
pedestrians>=1
对于相同的 acc_index)
我尝试以不同的方式做到这一点,但最后,我得到了不同的结果,所以我很困惑。例如,我试图计算这样的自行车行人事故:
df_bikes = df_veh[df_veh['veh_type']==1].groupby('acc_index').sum().reset_index()
bike_ped = pd.merge(df_bikes, df_ped, how='outer', on='acc_index')
bike_ped[(bike_ped['veh_type']==1) & (bike_ped['pedestrians']>=1)].groupby(
'acc_index').sum().reset_index()[['acc_index', 'veh_type', 'pedestrians']]
另一个例子,这就是我如何计算汽车和自行车之间的事故,这要归功于这篇文章中的评论。我相信这个至少是正确的。我试图找到最简单的方法来做到这一点(但也显示计算的行数)。
bike_car = df_veh[def_veh.groupby('acc_index')['veh_type'].
transform(lambda g: not({1, 2} - {*g}))][['acc_index', 'veh_type']]
len(bike_car.groupby(['acc_index']).size().reset_index()))
解决方案
考虑将车辆数据与pivot_table
行人groupby
聚合相结合,然后运行所需的query()
调用,其中每一行都是不同的acc_index
:
veh_dict = {'1': 'bicycle', '2': 'car', '3': 'bus'}
pvt_df = (df_veh.assign(val = 1)
.pivot_table(index = 'acc_index',
columns = 'veh_type',
values = 'val',
aggfunc='sum')
.set_axis([veh_dict[i] for i in list('123')],
axis = 'columns',
inplace = False)
.join(df_ped.assign(pedestrians = lambda x: x['pedestrians'].astype('int'))
.groupby('acc_index')['pedestrians']
.sum()
.to_frame(),
how = 'outer'
)
)
pvt_df
# bicycle car bus pedestrians
# acc_index
# 001 1.0 NaN NaN 1
# 002 1.0 1.0 NaN 2
# 003 2.0 NaN NaN 0
# 004 1.0 NaN NaN 1
# 005 NaN 2.0 NaN 4
# 006 NaN 1.0 1.0 3
# 007 1.0 1.0 NaN 0
# 008 3.0 NaN NaN 1
# 009 1.0 2.0 NaN 2
查询
# BIKES AND CARS
pvt_df.query('(bicycle >= 1) & (car >= 1)')
# bicycle car bus pedestrians
# acc_index
# 002 1.0 1.0 0.0 2
# 007 1.0 1.0 0.0 0
# 009 1.0 2.0 0.0 2
# BIKES AND PEDESTRIANS
pvt_df.query('(bicycle >= 1) & (pedestrians >= 1)')
# bicycle car bus pedestrians
# acc_index
# 001 1.0 0.0 0.0 1
# 002 1.0 1.0 0.0 2
# 004 1.0 0.0 0.0 1
# 008 3.0 0.0 0.0 1
# 009 1.0 2.0 0.0 2
# CARS AND PEDESTRIANS
pvt_df.query('(car >= 1) & (pedestrians > 1)')
# bicycle car bus pedestrians
# acc_index
# 002 1.0 1.0 0.0 2
# 005 0.0 2.0 0.0 4
# 006 0.0 1.0 1.0 3
# 009 1.0 2.0 0.0 2
### ONLY CARS
pvt_df.query('(bicycle == 0) & (car >= 1) & (bus == 0) & (pedestrians == 0)')
# Empty DataFrame
# Columns: [bicycle, car, bus, pedestrians]
# Index: []
### ONLY BICYCLES
pvt_df.query('(bicycle >= 1) & (car == 0) & (bus == 0) & (pedestrians == 0)')
# bicycle car bus pedestrians
# acc_index
# 003 2.0 0.0 0.0 0
### ONLY PEDESTRIANS
pvt_df.query('(bicycle == 0) & (car == 0) & (bus == 0) & (pedestrians >= 1)')
# Empty DataFrame
# Columns: [bicycle, car, bus, pedestrians]
# Index: []
推荐阅读
- javascript - Tabulator JS 中的级联下拉列
- python - 如何获取python函数内部定义的所有局部变量?
- java - 从 java 文件运行 java 文件
- django - Django 异常值:无效过滤器错误:
- python - 我想连接两个python arange,但我只获得第一个arange
- javascript - 理解 js 数组/对象
- python - 如何通过同一端口python为多个视频创建rtsp?
- google-kubernetes-engine - GKE 大使 http -> https 重定向、健康检查问题
- android - 如何在 Android 中将 Button 放置在 WebView 的顶部
- f# - 为什么在这里泛化具有显式类型注释的值?