我正在尝试使用熊猫删除重复的连续元素并保留数据框中的最后一个值

Posted

技术标签:

【中文标题】我正在尝试使用熊猫删除重复的连续元素并保留数据框中的最后一个值【英文标题】:I am trying to remove duplicate consequtive elements and keep the last value in data frame using pandas 【发布时间】:2021-07-30 18:46:57 【问题描述】:

数据框中有两列,我试图从“a”列中删除连续元素,并从“b”列中删除其对应元素,同时只保留最后一个元素。

import pandas as pd
a=[5,5,5,6,6,6,7,5,4,1,8,9]
b=[50,40,45,87,88,54,12,75,55,87,46,98]
df = pd.DataFrame(list(zip(a,b)), columns =['Patch', 'Reward'])
df=df.drop_duplicates(subset='Patch', keep="last")
df = df.set_index('Patch')
print (df)

当我运行它时,我得到:

       Reward
Patch        
6          54
7          12
5          75
4          55
1          87
8          46
9          98

但是,我想要的是:

Patch      Reward
5           45
6           54
7           12
5           75
4           55
1           87
8           46
9           98

PS:我不希望删除在另一个元素之后或系列中稍后重复的重复元素,但只删除连续的重复项,同时保持最后一个出现在连续的外观中。 我也不希望它被排序,它们应该以与列表中相同的顺序出现。

【问题讨论】:

groupby补丁,保留每组的最后一个元素? @ddg 我想通过分组我会丢失数据的原始索引? 【参考方案1】:

您可以创建一个新列,为每组连续元素分配一个 id,然后执行groupby 操作,然后执行last 聚合。

a=[5,5,5,6,6,6,7,5,4,1,8,9]
b=[50,40,45,87,88,54,12,75,55,87,46,98]
df = pd.DataFrame(list(zip(a,b)), columns =['Patch', 'Reward'])
df["group_id"]=(df.Patch != df.Patch.shift()).cumsum()
df = df.groupby("group_id").last()

输出

Patch  Reward 
5      45
6      54
7      12
5      75
4      55
1      87
8      46
9      98 

【讨论】:

显示错误 TypeError: 'Series' 对象是可变的,因此它们不能被散列 抱歉,但是当我将 print(df) 放入代码并执行它时,会打印原始 df 而不是所需的。 分配数据框。 df = df.groupby("group_id").last()。也编辑了代码 sn-p。

以上是关于我正在尝试使用熊猫删除重复的连续元素并保留数据框中的最后一个值的主要内容,如果未能解决你的问题,请参考以下文章

删除熊猫数据框中具有特定值的行[重复]

如何从包含前两列组合的熊猫数据框中删除行

删除熊猫数据框中的未命名列[重复]

如何从熊猫数据框中的列中删除字符串值

table.remove 删除某些元素,但不是全部

如果在熊猫数据框中其他功能[重复]