我想删除pandas rame中特定列中重复发生的、未改变的值(按组单独处理),换句话说,如果它没有发生在彼此之后,则保留剩余值.

特定列(在我的情况下,是value列).该群体是node.

我让它运行循环.但Python中的循环非常慢.

有没有方法可以在没有循环的大Pandas 身上实现同样的目标?

按时间排序的表格ASC:

time node value comment (not in df)
2024-05-07 13:39:31.315437 ns=4;i=6 NaN ok
2024-05-07 13:39:31.327564 ns=4;i=7 5,514E+09 ok
2024-05-07 13:39:31.328585 ns=4;i=8 1 ok
2024-05-07 13:39:31.425523 ns=4;i=9 33 ok
2024-05-07 13:39:31.561920 ns=4;i=10 False ok
... ... ...
2024-05-07 14:30:31.425454 ns=4;i=9 33 remove
... ... ...
2024-05-07 15:20:45.445578 ns=4;i=9 34 ok
... ... ...
2024-05-07 18:24:34.142277 ns=4;i=10 33 ok
2024-05-07 18:24:40.245277 ns=4;i=9 33 ok
2024-05-07 18:24:45.845477 ns=4;i=9 33 remove
node_values = {}
rows_to_delete = []
for index, row in df.iterrows():
    if row['node'] in node_values and node_values[row['node']] == row['value']:
        rows_to_delete.append(index)
    node_values[row['node']] = row['value']
df = df.drop(index=rows_to_delete)

之前的例子:

time node value
2024-05-07 13:39:31.315437 ns=4;i=6 NaN
2024-05-07 13:39:31.327564 ns=4;i=7 5,514E+09
2024-05-07 13:39:31.328585 ns=4;i=8 1
2024-05-07 13:39:31.425523 ns=4;i=9 33
2024-05-07 13:39:31.561920 ns=4;i=10 False
2024-05-07 13:39:31.625523 ns=4;i=9 33
2024-05-07 13:39:31.725523 ns=4;i=9 34
2024-05-07 13:39:31.825523 ns=4;i=50 34
2024-05-07 13:39:31.925523 ns=4;i=9 34
2024-05-07 13:39:32.125523 ns=4;i=9 33
2024-05-07 13:39:31.425523 ns=4;i=100 True

之后:

time node value
2024-05-07 13:39:31.315437 ns=4;i=6 NaN
2024-05-07 13:39:31.327564 ns=4;i=7 5,514E+09
2024-05-07 13:39:31.328585 ns=4;i=8 1
2024-05-07 13:39:31.425523 ns=4;i=9 33
2024-05-07 13:39:31.561920 ns=4;i=10 False
2024-05-07 13:39:31.725523 ns=4;i=9 34
2024-05-07 13:39:31.825523 ns=4;i=50 34
2024-05-07 13:39:32.125523 ns=4;i=9 33
2024-05-07 13:39:33.225523 ns=4;i=100 True

推荐答案

您可以过滤掉与前一行相同的行,如下所示:

filter= (df['node'] != df['node'].shift())

并且只 Select 满足条件的数据

filtered_df = df[filter]

Update

根据您的 comments ,您想要删除值(值列中)相同的 node ,您可以try 下面的代码来执行此操作.

df = pd.DataFrame(data)

filter_= df.groupby('node')['value'].shift() == df['value']

filtered_df = df[~filter_]

print(filtered_df)

注意:此代码将删除False Value后面的行

如果列值中的值为False,则后面的行将被删除.

Python相关问答推荐

单击Cookie横幅错误并在Selenium中启用搜索栏

使用pandas MultiIndex进行不连续 Select

如何使用函数正确索引收件箱?

Django注释:将时差转换为小数或小数

Python无法在已导入的目录中看到新模块

如何使用stride_tricks.as_strided逆转NumPy数组

如何使用entry.bind(FocusIn,self.Method_calling)用于使用网格/列表创建的收件箱

如何使用Jinja语法在HTML中重定向期间传递变量?

如果条件为真,则Groupby.mean()

用Python解密Java加密文件

如何在Python脚本中附加一个Google tab(已经打开)

avxspan与pandas period_range

如何将多进程池声明为变量并将其导入到另一个Python文件

优化器的运行顺序影响PyTorch中的预测

在pandas中使用group_by,但有条件

如何根据一列的值有条件地 Select 前N组?

joblib:无法从父目录的另一个子文件夹加载转储模型

无论输入分辨率如何,稳定扩散管道始终输出512 * 512张图像

旋转多边形而不改变内部空间关系

在pandas/python中计数嵌套类别