【问题标题】:Pandas: Drop duplicates in col[A] keeping row based on condition on col[B]Pandas:删除 col[A] 中的重复项,根据 col[B] 上的条件保持行
【发布时间】:2020-01-08 11:07:43
【问题描述】:

给定数据框:

df = pd.DataFrame({'col1': ['A', 'A', 'A','B','B'], 'col2': ['type1', 'type2', 'type1', 'type2', 'type1'] , 'hour': ['18:03:30','18:00:48', '18:13:46', '18:11:29', '18:06:31']  })
col1 col2   hour
A   type1   18:03:30 # Drop this row as (A type1) already present
A   type2   18:00:48
A   type1   18:13:46 # keep this row as (A type1) already present.
B   type2   18:11:29
B   type1   18:06:31

我想根据 col1,col2删除重复项

eg.(row(0): A type1, row(2): A type1)

保留仅具有最近时间的行,例如(18:13:46)。

我尝试使用 groupby 根据 col1 返回子集,并尝试使用 drop_duplicates 删除 col2 中的重复项。我需要想办法通过条件(最近一小时)

示例代码:

for key, grp in df.groupby('col1'):
  grp.drop_duplicates(subset='col2', keep="LATEST OF HOUR") 

预期结果:

col1 col2   hour
A   type1   18:03:30
A   type2   18:00:48
B   type2   18:11:29
B   type1   18:06:31

编辑添加上下文

我的原始数据框更大,解决方案也需要工作:


col1 col2   other  hour
A   type1   h  18:03:30 # Drop this row as (A type1) already present
A   type2   ss 18:00:48
A   type1   ll 18:13:46 # keep this row as (A type1) already present
B   type2   mm 18:11:29
B   type1   jj 18:06:31

它仍然需要根据小时删除列

【问题讨论】:

  • df.drop_duplicates(['col1','col2']) ?
  • df.drop_duplicates(['col1','col2'])?
  • 我如何确定 df.drop_duplicates(['col1','col2']) 将始终以 LATEST 时间(type1 18:13:46)删除 col ?
  • 您可以在同一子集上使用sort_values 以升序对值进行排序。然后使用 drop_duplicates
  • 好的,所以我对“小时”列进行排序,然后保留 Last 将保留按排序列的最后一个值,即使它不是像我的编辑一样紧随其后的列?

标签: python pandas dataframe group-by


【解决方案1】:
df.drop_duplicates(['col1','col2'] , keep = 'last')

【讨论】:

  • 我可能简化了太多,如果我有另一个不一样的列怎么办,我如何强制它保留 col 'hour' 的最后一个?
  • 顺便说一句,你的问题有点令人困惑。在数据框中,您声明“删除此行”并指向最新时间的行。然后在你想保留最新时间的行的解释状态下!上面的代码保留了每种类型 'col1' 和 'col2' 的最后一行。如果你想保留第一个,只需将keep更改为first
  • keep ='last' 将始终保留最后一个值&就时间而言,最后一个是最新的(除非行按降序排序)
  • 是的,我犯了一个错误。因为我想保留最后一个。
  • 那么你可以使用keep ='last'。这将保留最后一次出现。
【解决方案2】:

根据 anky_91 的评论,我这样解决了:

df.sort_values('hour').drop_duplicates(['col1','col2'] , keep = 'last')

这基于“小时”列进行排序,以便您确定 keep='last' 获取最后一个元素

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2020-05-11
    相关资源
    最近更新 更多