2 回答
TA贡献1982条经验 获得超2个赞
使用 和 具有适当的功能应该会得到你想要的。下面的用法将导致保留所有值,如果您只想要唯一的值,则可以将其更改为 。groupbyagglistset
df['cumsum'] = df.Name.ne(df.Name.shift()).cumsum()
df2 = df.groupby(df["cumsum"]).agg({'Name': 'first', 'Category': 'first', 'Port': list, 'Class': [list, 'count']})
df2.columns = df2.columns.droplevel(1).values[:-1].tolist() + ['Count']
df2 = df2.reset_index(drop=True)
这将为您提供:
Name Category Port Class Count
0 A Code [443, 80] [string1, string2] 2
1 B Math [443] [string3] 1
2 A Code [443] [string1] 1
3 B Math [80] [string4] 1
TA贡献2051条经验 获得超10个赞
这里的关键是用通用名称和类别来标识连续的行。一个简单的技巧是使用和:shiftcumsum
x = pd.Series(np.where((df['Name'] == df1['Name'])&(df['Category'] == df1['Category']), 0, 1),
index = df.index).cumsum()
完成此操作后,a 和 将完成以下工作:groupbyagg
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
添加回答
举报