【问题标题】:how to count value in a dataframe column based on filtering如何基于过滤计算数据框列中的值
【发布时间】:2021-10-19 04:18:23
【问题描述】:

鉴于此数据框:

DriverId    time                         SPEED
0           2021-04-16 21:40:00+00:00   58.500000
            2021-04-16 21:41:00+00:00   32.850000
            2021-04-16 21:42:00+00:00   89.633333
            2021-04-16 21:43:00+00:00   88.166667
            2021-04-16 21:44:00+00:00   118.016667
... ... ...
88          2021-04-27 07:30:00+00:00   79.566667
            2021-04-27 07:31:00+00:00   59.383333
            2021-04-27 07:32:00+00:00   89.133333
            2021-04-27 07:33:00+00:00   59.966667
            2021-04-27 07:34:00+00:00   25.72413

我想添加一列来计算每个司机在 40 公里/小时以下的速度数,所以我试过这个:

y[y.SPEED<40].count()

它显示了这个:

    SPEED    4721
    dtype: int64

这不是我想要的,expexted结果必须是这样的:

  DriverId        SPEED         count 
      0            15.20            2
                   32.850000 
                   89.633333
                  88.166667
                  118.016667
... ... ...
88              79.566667          1
                59.383333
                89.133333
                59.966667
                25.72413

我的数据框是我转换为数据框的系列

 y.info()
    <class 'pandas.core.frame.DataFrame'>
MultiIndex: 15082 entries, (0, Timestamp('2021-04-16 21:40:00+0000', tz='UTC')) to (88, Timestamp('2021-04-27 07:34:00+0000', tz='UTC'))
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   SPEED   15082 non-null  float64
dtypes: float64(1)
memory usage: 922.5 KB

【问题讨论】:

    标签: python pandas-groupby pandas-resample


    【解决方案1】:

    首先,我会在每一行而不是仅在组的第一行中都有 DriverId,然后尝试以下操作:

    y["Count of speed<40 for given driver"]=[sum((y.Driver==x) & (y["Speed"]<40)) for x in y.Driver]
    

    【讨论】:

    • 谢谢 himalaya bir shrestha 但在我的情况下 driverid 是一个索引而不是列
    • 您可以通过 y.reset_index(inplace = True) 更改列的索引
    【解决方案2】:
    df = pd.DataFrame([['0','2021-04-16 21:40:00+00:00',58.500000],
        ['0','2021-04-16 21:41:00+00:00', 32.850000],#FIRST ONE
        ['0','2021-04-16 21:42:00+00:00', 15.633333],#SECOND ONE
        ['0','2021-04-16 21:43:00+00:00', 88.166667],
        ['0','2021-04-16 21:44:00+00:00',118.016667],
        ['88','[2021-04-27 07:30:00+00:00',79.566667],
        ['88','2021-04-27 07:31:00+00:00',59.383333],
        ['88','2021-04-27 07:32:00+00:00',89.133333],
        ['88','2021-04-27 07:33:00+00:00',59.966667],
        ['88','2021-04-27 07:34:00+00:00',25.72413] # THIRD ONE
      ],columns=['driver_id','time','speed'])
    df = df.set_index("driver_id")
    counts = df[df['speed'] < 40].groupby(["driver_id",],as_index=False).agg(
        count_col=pd.NamedAgg(column="speed", aggfunc="count")
    )
    merged_Frame = pd.merge(df, counts, on = 'driver_id', how='inner')
    

    输出

    driver_id   time                   speed        count_col
    0   0   2021-04-16 21:40:00+00:00   58.500000   2
    1   0   2021-04-16 21:41:00+00:00   32.850000   2
    2   0   2021-04-16 21:42:00+00:00   15.633333   2
    3   0   2021-04-16 21:43:00+00:00   88.166667   2
    4   0   2021-04-16 21:44:00+00:00   118.016667  2
    5   88  [2021-04-27 07:30:00+00:00  79.566667   1
    6   88  2021-04-27 07:31:00+00:00   59.383333   1
    7   88  2021-04-27 07:32:00+00:00   89.133333   1
    8   88  2021-04-27 07:33:00+00:00   59.966667   1
    9   88  2021-04-27 07:34:00+00:00   25.724130   1
    

    参考

    1. pd.NamedAgg
    2. Merge two data frames based on common column values in Pandas

    编辑

    import pandas as pd
    
    df = pd.DataFrame([['0','2021-04-16 21:40:00+00:00',58.500000],
        ['0','2021-04-16 21:41:00+00:00', 32.850000],#FIRST ONE
        ['0','2021-04-16 21:42:00+00:00', 15.633333],#SECOND ONE
        ['0','2021-04-16 21:43:00+00:00', 88.166667],
        ['0','2021-04-16 21:44:00+00:00',118.016667],
        ['88','[2021-04-27 07:30:00+00:00',79.566667],
        ['88','2021-04-27 07:31:00+00:00',59.383333],
        ['88','2021-04-27 07:32:00+00:00',89.133333],
        ['88','2021-04-27 07:33:00+00:00',59.966667],
        ['88','2021-04-27 07:34:00+00:00',25.72413] # THIRD ONE
      ],columns=['driver_id','time','speed'])
    df = df.set_index(['driver_id', 'time'])
    df['count'] = df[df['speed'] < 40].groupby('driver_id')['speed'].transform('count')
    

    输出

    【讨论】:

    • 感谢 rinshan,但实际上我的数据框在成为数据框驱动程序 ID 之后是一个系列,而时间是一个索引,只有速度是一列,我将更新我的帖子以获得更多解释
    猜你喜欢
    • 1970-01-01
    • 2020-01-18
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多