根据发生次数合并行,同时在 Python 中的数据帧中维护唯一值

数据帧:


Name         Category        Port          Class

A                Code         443        string1

A                Code          80        string2

B                Math         443        string3

A                Code         443        string1

B                Math          80        string4

我尝试过的代码:


df1 = df.name.ne(df.name.shift())

count = df.name.groupby(df1.cumsum()).size()

我得到的输出:


Name     Category      Port       Class     Count

A            Code       443     string1         2

B            Math       443     string3         1

A            Code       443     string1         1

B            Math        80     string4         1

我想要的输出:


Name    Category         Port               Class   Count

A           Code      443, 80    string1, string2       2

B           Math          443             string3       1

A           Code          443             string1       1

B           Math           80             string4       1

任何帮助是值得赞赏的。


浮云间
浏览 96回答 2
2回答

临摹微笑

使用 和 具有适当的功能应该会得到你想要的。下面的用法将导致保留所有值,如果您只想要唯一的值,则可以将其更改为 。groupbyagglistsetdf['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  Count0    A      Code  [443, 80]  [string1, string2]      21    B      Math      [443]           [string3]      12    A      Code      [443]           [string1]      13    B      Math       [80]           [string4]      1

侃侃无极

这里的关键是用通用名称和类别来标识连续的行。一个简单的技巧是使用和:shiftcumsumx = pd.Series(np.where((df['Name'] == df1['Name'])&(df['Category'] == df1['Category']), 0, 1),              index = df.index).cumsum()完成此操作后,a 和 将完成以下工作:groupbyaggdf.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  Count0    A     Code  443, 80  string1, string2      21    A     Code      443           string1      12    B     Math      443           string3      13    B     Math       80           string4      1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python