我有一个如下所示的数据框:
time power speed state
1 14.00 29 3 1
2 14.01 30 3 2
3 14.02 29 3 3
4 14.03 30 3 4
5 14.04 29 3 5
6 14.05 30 3 6
7 14.06 29 3 6
8 14.07 30 3 6
9 14.08 29 3 6
10 14.09 30 3 5
11 14.10 29 3 5
12 14.11 30 3 5
13 14.12 29 3 5
14 14.13 30 3 6
15 14.14 31 4 6
16 14.15 32 4 6
每个周期从状态 5(第 10 行,仅在状态 6 之后)开始,并在状态 6 返回之前结束(即第 13 行)。所以周期 1 位于第 10 行和第 13 行之间。
这是一个大数据,并且有多个周期。我想将每个周期提取为数据框。 我尝试了一些迭代,但没有成功。
charge_cycles = []
current_charge_start = None
current_drive_start = None
total_energy_consumed = 0
drive_data = []
for index, row in data.iterrows():
if row['state'] == '6':
if current_drive_start is not None:
energy_during_drive = total_energy_consumed
charge_cycles.append(energy_during_drive)
drive_data.append(data.loc[current_drive_start:index])
current_drive_start = None
total_energy_consumed = 0
current_charge_start = row['time']
elif row['state'] == '5':
if current_charge_start is not None and current_drive_start is None:
current_drive_start = index
if current_drive_start is not None:
total_energy_consumed += row['power'] * (row['time'] - data.loc[current_drive_start, 'time'])
current_drive_start = index
# Print the energy consumption during driving between each charge cycle
for i, energy in enumerate(charge_cycles, start=1):
print(f"Charge Cycle {i}: Energy Consumed During Driving = {energy} units")
# Display the DataFrames for each driving cycle
for i, drive_df in enumerate(drive_data, start=1):
print(f"Driving Cycle {i}:\n{drive_df}")
这给了我整个数据框。谁能帮我解决这个问题的Python代码吗?
您可以尝试使用布尔索引和
groupby
:
m1 = df['state'].eq(5)
m2 = df['state'].shift().eq(6)
dfs = [g for k,g in df[m1].groupby((m1&m2).cumsum())]
子数据帧的输出列表:
[ time power speed state
5 14.04 29 3 5, time power speed state
10 14.09 30 3 5
11 14.10 29 3 5
12 14.11 30 3 5
13 14.12 29 3 5]