阅读 3 个不同选项的完整答案
严格映射充电/放电
您可以使用groupby.diff 获取每组的差异,然后使用numpy.sign 和map:
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