Вот код один вкладыш. : p Используется дифференциальная информация соседних строк и суммарное суммирование для назначения идентификаторов групп для каждой строки.
>>> df = pd.DataFrame({'id': ['A','B','C','D','E','F'],
'class': [1, 1, 0, 0, 1, 1]},
columns=['id', 'class'])
>>> pd.concat([df, pd.Series(map(lambda x: 1 if abs(x) > 0 else 0,
df['class'].diff().fillna(0)), name='groupid').cumsum()], axis=1)
id class groupid
0 A 1 0
1 B 1 0
2 C 0 1
3 D 0 1
4 E 1 2
5 F 1 2
Теперь вы можете использовать groupby() для получения объекта groupy.
>>> g = pd.concat([df, pd.Series(map(lambda x: 1 if abs(x) > 0 else 0,
df['class'].diff().fillna(0)), name='groupid').cumsum()], axis=1).groupby('groupid')
>>> for index, group_df in g:
print(group_df)
id class groupid
0 A 1 0
1 B 1 0
id class groupid
2 C 0 1
3 D 0 1
id class groupid
4 E 1 2
5 F 1 2
Полный код прилагается.
import pandas as pd
def groupby_binaryflag(df, key='class'):
return pd.concat([df,
pd.Series(map(lambda x: 1
if abs(x) > 0
else 0, df['class'].diff().fillna(0)),
name='groupid').cumsum()], axis=1).groupby('groupid')
if __name__ == '__main__':
df1 = pd.DataFrame({'id': ['A','B','C','D','E','F'],
'class': [1, 1, 0, 0, 1, 1]}, columns=['id', 'class'])
df2 = pd.DataFrame({'id': ['A','B','C','D','E','F', 'G', 'H', 'I', 'J', 'K', 'L'],
'class': [1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1]}, columns=['id', 'class'])
for df in [df1, df2]:
for index, group_df in groupby_binaryflag(df):
print(group_df)
print("=====\n")
Выход:
id class groupid
0 A 1 0
1 B 1 0
id class groupid
2 C 0 1
3 D 0 1
id class groupid
4 E 1 2
5 F 1 2
=====
id class groupid
0 A 1 0
1 B 1 0
id class groupid
2 C 0 1
3 D 0 1
id class groupid
4 E 1 2
5 F 1 2
id class groupid
6 G 0 3
7 H 0 3
8 I 0 3
id class groupid
9 J 1 4
10 K 1 4
11 L 1 4
=====
Вы можете разместить желаемый результат, чтобы мы могли понять ваш вопрос? –