【问题标题】:Replace original rows with duplicate rows then remove duplicates用重复行替换原始行,然后删除重复行
【发布时间】:2019-10-12 01:59:28
【问题描述】:

我有一个类似于

的数据框
    Name   Value  Value2
     A       1      11        
     B       2      12
     C       3      13
     A       4      14
     B       5      15

我需要获取名称重复的行,并将第一次出现的行替换为最后一次出现的行,然后删除最后的重复项。所以在这个例子中,输出将是

    Name   Value  Value2
     A       4      14
     B       5      15
     C       3      13    

什么是这样做的有效方法?

【问题讨论】:

  • 请检查我的答案

标签: python python-3.x pandas


【解决方案1】:

像这样?

data.drop_duplicates(subset='Name', keep='last').sort_values('Name')

【讨论】:

  • 否,因为它不会替换索引。如果我错了,输出将是 C,A,B 之类的,请纠正我
  • 是的,因为您可以在事后按'Name' 排序。 data.drop_duplicates(subset='Name', keep='last').sort_values('Name')
  • 是的,如果需要,您可以对其进行排序。我将编辑答案。
【解决方案2】:

使用groupby.last:

df.groupby('Name',as_index=False).last()

输出:

  Name  Value  Value2
0    A      4      14
1    B      5      15
2    C      3      13

【讨论】:

  • 类似于我为bimarian's answer 写的内容,您可以在groupby 调用中使用as_index=False 参数抢占reset_index 的需求。
【解决方案3】:

尝试使用

df = df.groupby('Name',as_index=False).nth(-1)

【讨论】:

  • df.groupby('Name', as_index=False).nth(-1)
  • 您正在将'Name' 列移动到索引中。您可以通过传递参数as_index=False 来正确保存数据帧。此外,当-1 可以时,无需通过[-1]
【解决方案4】:

由于您想保留每个单独的 Name 值的最后一次出现,您不会关心替换较早的值。您应该只删除重复项,由Name 过滤并传递参数keep='last'

data = {'Name':['A','B','C','A','B'],'Value':[1,2,3,4,5],'Value2':[11,12,13,14,15]}
df = pd.DataFrame(data)
df = df.drop_duplicates('Name',keep='last')
print(DataFrame)

输出:

  Name  Value  Value2
2    C      3      13
3    A      4      14
4    B      5      15

【讨论】:

猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多