Ключевым моментом здесь является обозначение последовательных строк с общим именем и категорией. Простой трюк заключается в использовании shift
и cumsum
:
x = pd.Series(np.where((df['Name'] == df1['Name'])&(df['Category'] == df1['Category']), 0, 1),
index = df.index).cumsum()
Как только это будет сделано, groupby
и agg
выполнят свою работу:
df.assign(Count=1, Port=df['Port'].astype(str)).groupby(['Name', 'Category',x]).agg(
{'Port': ', '.join, 'Class': ', '.join, 'Count': 'sum'}).reset_index().drop(columns='level_2')
Это дает:
Name Category Port Class Count
0 A Code 443, 80 string1, string2 2
1 A Code 443 string1 1
2 B Math 443 string3 1
3 B Math 80 string4 1