为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

浮云间 2022-08-25 15:14:02
数据帧:Name         Category        Port          ClassA                Code         443        string1A                Code          80        string2B                Math         443        string3A                Code         443        string1B                Math          80        string4我尝试过的代码:df1 = df.name.ne(df.name.shift())count = df.name.groupby(df1.cumsum()).size()我得到的输出:Name     Category      Port       Class     CountA            Code       443     string1         2B            Math       443     string3         1A            Code       443     string1         1B            Math        80     string4         1我想要的输出:Name    Category         Port               Class   CountA           Code      443, 80    string1, string2       2B           Math          443             string3       1A           Code          443             string1       1B           Math           80             string4       1任何帮助是值得赞赏的。
查看完整描述

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


查看完整回答
反对 回复 2022-08-25
?
侃侃无极

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


查看完整回答
反对 回复 2022-08-25
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信