【问题标题】:Extracting values from a df从df中提取值
【发布时间】:2022-11-15 12:28:39
【问题描述】:

问题陈述 每辆车有多个充电和放电实例,获取特定日期每辆车的最小充电量、最大充电量、最小放电量和最大放电量

df1

日期时间 vehicle_no soc SOC Diff 0 2022-10-01 02:27:56 DL21GD0100 80.0 0 1 2022-10-01 02:28:26 DL21GD0100 80.0 放电 2 2022-10-01 02:28:56 DL21GD0100 80.0 放电 3 2022-10-01 02:29:26 DL21GD0100 80.0 放电 4 2022-10-01 02:29:56 DL21GD0100 69.0 放电 5 2022-10-01 02:29:56 DL21GD0100 70.0 充电 6 2022-10-01 02:29:56 DL21GD0100 71.0 充电 7 2022-10-01 02:29:56 DL21GD0100 72.0 充电 8 2022-10-01 03:16:00 DL21GD0100 63.0 放电 9 2022-10-01 03:16:30 DL21GD0100 23.0 放电 10 2022-10-01 04:17:00 DL21GD0100 54.0 充电 11 2022-10-01 09:17:30 WB25M9298 24.0 充电 12 2022-10-01 09:18:00 WB25M9298 25.0 充电

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    阅读 3 个不同选项的完整答案

    严格映射充电/放电

    您可以使用groupby.diff 获取每组的差异,然后使用numpy.signmap

    df['status'] = np.sign(df.groupby('vehicle_no')['soc'].diff()
                           ).map({1: 'Charging', -1: 'Discharging'})
    

    或者numpy.select

    s = df.groupby('vehicle_no')['soc'].diff()
    
    df['status'] = np.select([s>0, s<0], ['Charging', 'Discharging'], np.nan)
    

    输出:

              Date      Time  vehicle_no   soc       status
    0   2022-10-01  02:27:56  DL21GD0100  80.0          NaN
    2   2022-10-01  02:28:56  DL21GD0100  80.0          NaN
    3   2022-10-01  02:29:26  DL21GD0100  80.0          NaN
    4   2022-10-01  02:29:56  DL21GD0100  69.0  Discharging
    5   2022-10-01  02:29:56  DL21GD0100  70.0     Charging
    6   2022-10-01  02:29:56  DL21GD0100  71.0     Charging
    7   2022-10-01  02:29:56  DL21GD0100  72.0     Charging
    8   2022-10-01  09:16:00   WB25M9298  23.0          NaN
    9   2022-10-01  09:16:30   WB25M9298  23.0          NaN
    10  2022-10-01  09:17:00   WB25M9298  24.0     Charging
    11  2022-10-01  09:17:30   WB25M9298  24.0          NaN
    12  2022-10-01  09:18:00   WB25M9298  25.0     Charging
    

    映射充电/放电稳定作为放电

    如果您想将等值视为放电:

    df['status'] = np.where(df.groupby('vehicle_no')['soc'].diff().gt(0), 'Charging', 'Discharging')
    

    输出:

              Date      Time  vehicle_no   soc       status
    0   2022-10-01  02:27:56  DL21GD0100  80.0  Discharging
    2   2022-10-01  02:28:56  DL21GD0100  80.0  Discharging
    3   2022-10-01  02:29:26  DL21GD0100  80.0  Discharging
    4   2022-10-01  02:29:56  DL21GD0100  69.0  Discharging
    5   2022-10-01  02:29:56  DL21GD0100  70.0     Charging
    6   2022-10-01  02:29:56  DL21GD0100  71.0     Charging
    7   2022-10-01  02:29:56  DL21GD0100  72.0     Charging
    8   2022-10-01  09:16:00   WB25M9298  23.0  Discharging
    9   2022-10-01  09:16:30   WB25M9298  23.0  Discharging
    10  2022-10-01  09:17:00   WB25M9298  24.0     Charging
    11  2022-10-01  09:17:30   WB25M9298  24.0  Discharging
    12  2022-10-01  09:18:00   WB25M9298  25.0     Charging
    

    映射充电/放电与之前的状态一样稳定:

    d = {1: 'Charging', -1: 'Discharging'}
    df['status'] = (df.groupby('vehicle_no')['soc']
                    .transform(lambda s: np.sign(s.diff()).map(d).ffill())
                    .fillna('Discharging')
                   )
    

    输出:

              Date      Time  vehicle_no   soc       status
    0   2022-10-01  02:27:56  DL21GD0100  80.0  Discharging
    2   2022-10-01  02:28:56  DL21GD0100  80.0  Discharging
    3   2022-10-01  02:29:26  DL21GD0100  80.0  Discharging
    4   2022-10-01  02:29:56  DL21GD0100  69.0  Discharging
    5   2022-10-01  02:29:56  DL21GD0100  70.0     Charging
    6   2022-10-01  02:29:56  DL21GD0100  71.0     Charging
    7   2022-10-01  02:29:56  DL21GD0100  72.0     Charging
    8   2022-10-01  09:16:00   WB25M9298  23.0  Discharging
    9   2022-10-01  09:16:30   WB25M9298  23.0  Discharging
    10  2022-10-01  09:17:00   WB25M9298  24.0     Charging
    11  2022-10-01  09:17:30   WB25M9298  24.0     Charging
    12  2022-10-01  09:18:00   WB25M9298  25.0     Charging
    

    【讨论】:

      猜你喜欢
      • 2021-09-14
      • 1970-01-01
      • 2019-11-21
      • 2023-01-30
      • 2019-11-02
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多