【问题标题】:drop duplicated and concat pandas删除重复和连接熊猫
【发布时间】:2020-06-23 04:15:51
【问题描述】:

我有一个如下所示的数据框:

'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 相同,我想:

如果 cmets = None 和 = str:只保留非 None 的 cmets(例如:id = 1,保留 cmets “hello”) if two cmets = str: 用“//”连接两个 cmets(例如 id = 3, cmets = "hola // hello")

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

谢谢

【问题讨论】:

  • 你能添加预期的输出DataFrame吗?

标签: python-3.x pandas dataframe concat


【解决方案1】:

我相信您需要 DataFrame.dropna 按列 comments 然后 GroupBy.aggjoinGroupBy.last,最后添加 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

【讨论】:

  • 感谢您的回答。它可以工作,但是如果 id 有 cmets = None,我在 df1 中没有 id ...示例:id = 3 和 cmets = None 结果:我没有 id = 3 和 cmets = None
  • 非常感谢如果我想保留列“col2”?
  • @Eolynas - 哎呀,我想念它。
  • @Eolynas - dates 的逻辑是什么?因为对于id=1,它是第一个date,每个id,对于id=3,它是最后一个日期。
  • 没有真正的逻辑......只是一个例子,对不起^^最后一个日期是完美的
猜你喜欢
  • 2013-10-28
  • 2016-01-30
  • 2021-09-05
  • 1970-01-01
  • 2018-07-11
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多