Как заметил @Peter Leimbigler, мне также не совсем понятна логика генерации суффикса. Я думаю, что от 1000_3 до 1000_6 все должны быть 1000_2.
Чтобы использовать групповую передачу, вам нужно создать новую группировку с чем-то вроде этого:
for _, values in df.groupby('SNo'):
group_label = 0
for row in values.index:
if df.loc[row, 'VarPer'] !=0:
df.loc[row, 'group'] = group_label
else:
group_label+=1
df.loc[row, 'group'] = group_label
РЕДАКТИРОВАТЬ: Вы, вероятно, не должны использовать цикл для записи непосредственно в фрейм данных. Вместо этого вы можете создать список, а затем создать новый столбец, используя этот список. Это будет быстрее.
new_grouping = []
for _, values in df.groupby('SNo'):
label = 0
group = []
for row in values.index:
if df.loc[row, 'VarPer'] !=0:
group.append(label)
else:
label+=1
group.append(label)
new_grouping.extend(group)
df['group'] = new_grouping
Это не будет быстрым, но, возможно, вы (или кто-то еще) можете векторизовать это.
Затем вы можете использовать groupby, чтобы получить ваши усредненные значения:
df = df.groupby(['SNo','group'],as_index = False])["VarPer"].mean().reset_index()
Если ваши суффиксы действительно должны быть такими, как я описал выше, вы можете сделать:
df['SNo'] = df['SNo'].map(str) +'_' + df['group'].map(lambda x: str(int(x)).zfill(2))
Это даст вам:
SNo group VarPer Value
1000_1 1.0 0 1.2
1000_1 1.0 1 2.2
1000_1 1.0 2 3.2
1000_1 1.0 3 4.2
1000_1 1.0 4 5.7
1000_1 1.0 5 7.7
1000_2 2.0 0 0.9
1000_2 2.0 1 1.9
1000_2 2.0 2 2.9
1000_2 2.0 3 4.4
1000_2 2.0 4 5.9
1001_1 1.0 0 0.5
1001_1 1.0 1 1.5
1001_1 1.0 2 3.0
1001_2 2.0 0 1.0
1001_2 2.0 1 1.0
1001_2 2.0 2 1.0