<p>样本数据:</p>
<pre><code>df_str = '''
name,row,column,length_of_field
AB000M,8,12,1
AB000M,9,12,1
AB000M,10,0,80
AB000M,10,12,1
AB000M,11,1,1
AB000M,21,0,80
AB000M,22,0,80
AB000M,23,11,1
AB000M,24,11,1
AB000M,25,0,80
AB000M,26,0,80
AB000M,27,0,80
AB000M,28,11,1
AB000M,29,0,80
'''
df = pd.read_csv(io.StringIO(df_str.strip()), sep=',', index_col=False)
</code></pre>
<p>解决方案:</p>
<pre><code># split the row which to update or left
cond = df['column'] == 0
df_to_update = df[cond].copy()
df_left = df[~cond].copy()
# modify the update rows
df_to_update['column'] = df_to_update['length_of_field']
df_to_update['row'] -= 1
# create tag for which is diff 1 with the previous row
cond = df_to_update['row'].diff() != 1
df_to_update['tag'] = np.where(cond, 1, 0)
# cumsum tag to creat group
df_to_update['label'] = df_to_update['tag'].cumsum()
print(df_to_update)
# name row column length_of_field tag label
# 2 AB000M 9 80 80 1 1
# 5 AB000M 20 80 80 1 2
# 6 AB000M 21 80 80 0 2
# 9 AB000M 24 80 80 1 3
# 10 AB000M 25 80 80 0 3
# 11 AB000M 26 80 80 0 3
# 13 AB000M 28 80 80 1 4
# agg groupy left first row, and sum(length_of_field)
obj_list = []
for tag, group in df_to_update.groupby('label'):
obj = group.iloc[0].copy()
obj['length_of_field'] = group['length_of_field'].sum()
obj_list.append(obj)
dfn_to_update = pd.concat(obj_list,axis=1).T[df.columns]
# merge final result
dfn = df_left.append(dfn_to_update).sort_index()
</code></pre>
<p>结果:</p>
<pre><code>print(dfn)
name row column length_of_field
0 AB000M 8 12 1
1 AB000M 9 12 1
2 AB000M 9 80 80
3 AB000M 10 12 1
4 AB000M 11 1 1
5 AB000M 20 80 160
7 AB000M 23 11 1
8 AB000M 24 11 1
9 AB000M 24 80 240
12 AB000M 28 11 1
13 AB000M 28 80 80
print(df)
name row column length_of_field
0 AB000M 8 12 1
1 AB000M 9 12 1
2 AB000M 10 0 80
3 AB000M 10 12 1
4 AB000M 11 1 1
5 AB000M 21 0 80
6 AB000M 22 0 80
7 AB000M 23 11 1
8 AB000M 24 11 1
9 AB000M 25 0 80
10 AB000M 26 0 80
11 AB000M 27 0 80
12 AB000M 28 11 1
13 AB000M 29 0 80
</code></pre>