<p>这似乎给出了您要查找的结果:</p>
<pre class="lang-py prettyprint-override"><code>df = pd.DataFrame({
'car_id': ['1', '2', '2', '3', '3', '3', '3', '3', '1','2','2','4','4'],
'odometer_start': [0, 5, 9, 1,3, 8,19,52,11,22,64,132, 144],
'need_maintanince': [0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1]
})
df['miles_since_maint'] = (df.groupby('car_id')['odometer_start'].diff()
* df['need_maintanince']).fillna(0)
</code></pre>
<pre><code> car_id ... miles_since_maint
0 1 ... 0.0
1 2 ... 0.0
2 2 ... 0.0
3 3 ... 0.0
4 3 ... 2.0
5 3 ... 0.0
6 3 ... 11.0
7 3 ... 33.0
8 1 ... 0.0
9 2 ... 0.0
10 2 ... 42.0
11 4 ... 0.0
12 4 ... 12.0
</code></pre>
<hr/>
<p>按评论编辑:</p>
<pre class="lang-py prettyprint-override"><code>df = pd.DataFrame({
'car_id': ['1', '1', '1', '1', '1', '1', '1', '1', '1','1','1','1'],
'odometer_start': [0, 3, 6, 9, 13, 18, 39, 89, 101, 107, 122, 182],
'odometer_end': [3, 6, 9, 13, 18, 39, 89, 101, 107, 122, 182, 206],
'need_maintanince': [0,0,1,0,0,0,1,0,1,0,1,0],
'miles_since_maint': [0,0,0,4,9,30,80,12,18,15,75,24]})
df['odo_chg'] = df['odometer_end'] - df['odometer_start']
maint_group = df['need_maintanince'].shift().cumsum().fillna(0)
df['miles_since_maint_2'] = (df.groupby(['car_id', maint_group])['odo_chg'].cumsum())
# Reassign initial group to 0 per desired output
df.loc[maint_group == 0, 'miles_since_maint_2'] = 0
df.T
</code></pre>
<p>提供(转置以便于查看)</p>
<pre><code> 0 1 2 3 4 5 6 7 8 9 10 11
car_id 1 1 1 1 1 1 1 1 1 1 1 1
odometer_start 0 3 6 9 13 18 39 89 101 107 122 182
odometer_end 3 6 9 13 18 39 89 101 107 122 182 206
need_maintanince 0 0 1 0 0 0 1 0 1 0 1 0
miles_since_maint 0 0 0 4 9 30 80 12 18 15 75 24
odo_chg 3 3 3 4 5 21 50 12 6 15 60 24
miles_since_maint_2 0 0 0 4 9 30 80 12 18 15 75 24
</code></pre>