数据框:
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
感谢任何帮助。
最佳答案
使用groupby
和agg
以及适当的函数应该可以得到你想要的。下面使用list
,这将导致保留所有值,如果您只想要唯一的值,可以将其更改为set
。
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
关于python - 根据发生情况合并行,同时维护 Python 中 DataFrame 中的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60597282/