如何在每个组中使用不同的条件drop_duplicate?

时间:2019-03-28 03:31:40

标签: python pandas grouping drop-duplicates

我有dataFrame,我需要根据另一列'abs(col1-col2)'中的最小值删除每个组('col1')的重复项,但是我需要通过取最后一个组来更改此条件“ abs(col1-col2)”中的最大值对应于“ col1”中的最后一个组,在该组中,我对“ col1”进行了升序排序。 (表现为循环)

更新1:

我需要动态分配最后一组。

例如,如果我的数据框为

  • 创建DataFrame

df = pd.DataFrame( {'col0':['A','A','A','A','A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B','B','B','B','B'],'col1':[1,1,1,2,2,2,3,3,3,4,4,4,2,2,2,3,3,3,4,4,4,5,5,5], 'col2':[2,3,4,1,3,4,1,2,4,1,2,3,3,4,5,2,4,5,2,3,5,2,3,4]})

计算差异列(此列将作为条件)

df['abs(col1 - col2)']=abs(df['col1']-df['col2'])

  • 原始Df如下:

enter image description here

  • 所需的Df应该如下所示:

enter image description here

  • 我的审判:

    df.sort_values(by=['col0','col1','abs(col1 - col2)','col2'],ascending=[True,True,True,False]).drop_duplicates(['col0','col1'])

  • 结果如下:

enter image description here

2 个答案:

答案 0 :(得分:2)

已更新:

如果我的理解正确,那么您每次在col1上达到最大值时都希望每个排序顺序不同。

  1. 提取排序不同的组:
df.groupby(['col0'], as_index=False)['col1'].max()
  1. 像您一样重复df
  2. 使用正确的排序,仅将在步骤1中找到的组去重复。您可以通过合并原始df来获得这些组:
pd.merge(df, col1_max_groups)
  1. 使用新值更新重复数据删除的DataFrame

完整示例:

col1_max_groups = df.groupby(['col0'], as_index=False)['col1'].max()
deduped = df.sort_values(['col0', 'col1', 'abs(col1 - col2)', 'col2'], 
                         ascending=[True, True, True, False]) \
    .drop_duplicates(['col0', 'col1']) \
    .set_index(['col0', 'col1'])
update = pd.merge(df, col1_max_groups) \
    .sort_values(['col0', 'col1', 'abs(col1 - col2)', 'col2'], 
                 ascending=[True, True, False, False]) \
    .drop_duplicates(['col0', 'col1'])
deduped.update(update.set_index(['col0', 'col1']))
deduped.reset_index()

# returns
# col0  col1  col2  abs(col1 - col2)
#    A     1     2                 1
#    A     2     3                 1
#    A     3     4                 1
#    A     4     1                 3
#    B     2     3                 1
#    B     3     4                 1
#    B     4     5                 1
#    B     5     2                 3

答案 1 :(得分:1)

如果要获得此特定结果,则可以拆分数据框并使用两个不同的规则,然后再次合并它们。例如:

import pandas as pd

df = pd.DataFrame( {'col1':[1,1,1,2,2,2,3,3,3,4,4,4], 'col2':[2,3,4,1,3,4,1,2,4,1,2,3]})

df['abs(col1 - col2)']=abs(df['col1']-df['col2'])

df = df.sort_values(by=['col1','abs(col1 - col2)','col2'],ascending=[True,True,False]).drop_duplicates('col1')
df1 = df.loc[df['col1'] != 4]

df2 = df.loc[df['col1'] == 4]
df2 = df2.sort_values(by=['col1','abs(col1 - col2)','col2'],ascending=[True,True,False])
df2Last = df2.tail(1)

df = pd.concat([df1, df2Last])

结果:

col1  col2  abs(col1 - col2)
 1     2                 1
 2     3                 1
 3     4                 1
 4     1                 3