开发者社区 问答 正文

删除和合并重复的Pandas

我有一个看起来像这样的数据框:

'id': ["1", "2", "1", "3", "3", "4"],
'date': ["2017", "2011", "2019", "2013", "2017", "2018"],
'code': ["CB25", "CD15", "CZ10", None, None, "AZ51"],
'col_example': ["22", None, "22", "55", "55", "121"],
'comments': ["bonjour", "bonjour", "bonjour", "hola", "Hello", None]

结果:

  id   date  code      col_example   ....       comments
0  1   2019  CB25/CZ10          22   ....        bonjour (and not bonjour // bonjour)
1  2   2011  CD15             None   ....        bonjour
2  3   2017  None               55   ....  hola // Hello
3  4   2018  AZ51              121   ....           None

我想保留一个ID

如果两个ID相同,我想:

如果comments = None和= str:仅保留不为None的注释(示例:id = 1,保留注释“ hello”)。如果两个注释= str:将两个注释连接为“ //”(示例id = 3,注释=“ hola //您好”)

目前,我尝试使用sort_value和drop_duplicate没有成功

谢谢

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 18:00:02 398 分享 版权
1 条回答
写回答
取消 提交回答
  • 我相信您需要按列注释添加DataFrame.dropna,然后使用join和GroupBy.last添加GroupBy.agg,最后添加DataFrame.mask将空字符串替换为None行:

    df1 = (df.groupby('id')
             .agg({'date': 'last',
                   'comments': lambda x: ' // '.join(x.dropna())})
             .replace({'comments': {'': None}})
             .reset_index())
    
    print (df1)
      id  date       comments
    0  1  2019        bonjour
    1  2  2011        bonjour
    2  3  2017  hola // Hello
    3  4  2018           None
    

    编辑:为避免删除所有列,必须将它们全部聚合,您可以为聚合动态创建字典,例如:

    df = pd.DataFrame({'id': ["1", "2", "1", "3", "3", "4"],
    'date': ["2017", "2011", "2019", "2013", "2017", "2018"],
    'code': ["CB25", "CD15", "CB25", None, None, "AZ51"],
    'col_example': ["22", None, "22", "55", "55", "121"],
    
    'comments': [None, "bonjour", "bonjour", "hola", "Hello", None]})
    print (df)
      id  date  code col_example comments
    0  1  2017  CB25          22     None
    1  2  2011  CD15        None  bonjour
    2  1  2019  CB25          22  bonjour
    3  3  2013  None          55     hola
    4  3  2017  None          55    Hello
    5  4  2018  AZ51         121     None
    
    d = dict.fromkeys(df.columns.difference(['id','comments']), 'last')
    d['comments'] = lambda x: ' // '.join(x.dropna())
    print (d)
    {'code': 'last', 'col_example': 'last', 'date': 'last', 
           'comments': <function <lambda> at 0x000000000ECA99D8>}
    
    df1 = (df.groupby('id')
             .agg(d)
             .replace({'comments': {'': None}})
             .reset_index())
    
    print (df1)
      id  code col_example  date       comments
    0  1  CB25          22  2019        bonjour
    1  2  CD15        None  2011        bonjour
    2  3  None          55  2017  hola // Hello
    3  4  AZ51         121  2018           None
    

    回答来源:stackoverflow

    2020-03-24 18:00:16
    赞同 展开评论
问答标签:
问答地址: