python - 按条件计数应用于 Pandas 中的同一列
问题描述
这是我的数据框。
acc_index veh_count veh_type
001 1 1
002 2 1
002 2 2
003 2 1
003 2 2
004 1 1
005 2 1
005 2 3
006 1 2
007 2 1
007 2 2
008 2 1
008 2 1
009 3 1
009 3 1
009 3 2
acc_index 对于每个事故都是唯一的
veh_count 显示有多少车辆涉及一次事故
veh_type 显示事故中涉及的车辆类型(1=自行车,2=汽车,3=公共汽车)。
我想要做的是计算汽车和自行车之间的事故数量(因此,对于同一个 acc_index , veh_type=1 和 veh_type=9),即使涉及更多的汽车或自行车,我仍然想把它算作一场事故。我怎样才能做到这一点?
我试着用下面的代码来做,但我得到了所有涉及汽车或自行车的事故的计数,我只想得到它们之间的那些。
df[(df['veh_count'] >=2) & (df.veh_type.isin(['1','2']))].groupby(['acc_index', 'veh_count', 'veh_type']).count()
我想在下面得到这样的东西,而且还有整个数据框,而不仅仅是总和。
acc_index veh_count veh_type count
002 2 1
002 2 2
count 1
003 2 1
003 2 2
count 1
007 2 1
007 2 2
count 1
009 3 1
009 3 1
009 3 2
count 1
total_count 4
如果您有更好的解决方案/想法,我将不胜感激。
解决方案
IIUC,你可以检查veh_type
那些感兴趣的和groupby:
(df.assign(car=df.veh_type.eq(1),
bike=df.veh_type.eq(2)) # change 2 to correct type
[['acc_index','car','bike']]
.groupby('acc_index')
.any()
.all(1).sum()
)
输出:
4
更新:如果你想要所有的行:
s = (df.assign(car=df.veh_type.eq(1),
bike=df.veh_type.eq(2)) # change 2 to correct type
[['acc_index','car','bike']]
.groupby('acc_index')
.any()
.all(1)
)
df[df['acc_index'].map(s)]
输出:
acc_index veh_count veh_type
1 2 2 1
2 2 2 2
3 3 2 1
4 3 2 2
9 7 2 1
10 7 2 2
13 9 3 1
14 9 3 1
15 9 3 2
推荐阅读
- reactjs - 限制儿童类型
- java - Java mail API on send mail where mail body应该有测试报告的摘要
- python-3.x - Python 和 Kivy:如何从内存中更新图像?
- elasticsearch - 如何在elasticsearch中获取文档的开始日期和结束日期字段之间的每一天的存储桶
- redux - 一旦我实现了 redux,我是否将它用于我拥有的每个道具?
- chainlink - 尝试启动chainlink节点时接收到无效的数据库URL
- python-3.x - 类型提示子类,其中包含对其自身类型的其他实例的引用
- javascript - 如何使用 javascript/HTML 将删除、编辑、保存按钮添加到浏览表的每一行
- c++ - 使用带返回和不带返回的递归反转数字
- uml - Web 应用程序的用例图