首页 > 解决方案 > 按条件计数应用于 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

如果您有更好的解决方案/想法,我将不胜感激。

标签: pythonpandascount

解决方案


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

推荐阅读