繁体   English   中英

pandas 重复块上的 drop_duplicates

[英]pandas drop_duplicates on blocks of duplicates

我试图找到一个优雅的解决方案,将缓慢移动的数据的完整时间序列转换为压缩形式,然后我可以将其与 pd.merge_asof 一起使用。

例如下面的数据框:

2023-01-01  A
2023-01-02  B
2023-01-03  B
2023-01-04  B
2023-01-05  C
2023-01-06  C
2023-01-07  A
2023-01-08  B

我想要实现的是保留重复块的第一条记录,即

2023-01-01  A
2023-01-02  B
2023-01-05  C
2023-01-07  A
2023-01-08  B

想到的是df.sort_index().drop_duplicates(keep='first')但它执行全局 groupby 并且不考虑AB稍后再次出现。

非常感谢您的帮助:)

假设您的第二列名为name (例如),使用pandas.DataFrame.shift function 的简短方法捕获每个连续组中的第一个唯一值(向下走):

df[df['name'] != df['name'].shift(1)]

           name
2023-01-01    A
2023-01-02    B
2023-01-05    C
2023-01-07    A
2023-01-08    B

您应该使用shift function 将每一行与前一行进行比较,然后检查值列中的更改。 现在您可以使用 boolean 索引到发生更改的 select 行。

df["date"] = pd.to_datetime(df["date"])
df["change"] = df["value"] != df["value"].shift()
df = df[df["change"]]

df =df.drop(columns=["change"])

Output:

        date value
0 2023-01-01     A
1 2023-01-02     B
4 2023-01-05     C
6 2023-01-07     A
7 2023-01-08     B

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM