[英]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 并且不考虑A
和B
稍后再次出现。
非常感谢您的帮助:)
假设您的第二列名为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.