pandas从列中删除特定序列

2024-04-25 14:53:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从我的专栏中删除特定的序列,因为它们出现的太多了,并没有给我提供很多额外的信息。数据库由节点之间的边组成。在这种情况下,节点1和节点1、节点1和节点2、节点2和节点3之间会有一条边。。。。。在

然而,边缘1-5在实际数据库中大约发生80.000次。我想把这些过滤掉,只保留“不太常见”的互动。在

假设我的数据帧是这样的

>>> datatry
   num  line    
0   1    56
1   1    90  
2   2    66  
3   3    4  
4   1    23  
5   5    22  
6   3    144
7   5    33

到目前为止,我所做的只是删除一个重复的序列:

^{pr2}$

如何将上面的代码(删除所有重复整数1的行并只保留值为1的第一行)更改为删除特定序列的所有行的代码?例如:先是1,然后是5?在本例中,我希望删除该序列中出现的值为1的行和值为5的行。我的最终结果是:

>>> datatry
   num  line    
0   1    56
1   1    90  
2   2    66  
3   3    4  
4   3    144
5   5    33

Tags: 数据代码信息数据库节点line情况序列
2条回答

有一种方法:

import numpy as np
import pandas as pd

def find_drops(seq, df):
    if seq:
        m = np.logical_and.reduce([df.num.shift(-i).eq(seq[i]) for i in range(len(seq))])
        if len(seq) == 1:
            return pd.Series(m, index=df.index)
        else:
            return pd.Series(m, index=df.index).replace({False: np.NaN}).ffill(limit=len(seq)-1).fillna(False)
    else:
        return pd.Series(False, index=df.index)


find_drops([1], df)
#0     True
#1     True
#2    False
#3    False
#4     True
#5    False
#6    False
#7    False
#dtype: bool

find_drops([1,1,2,3], df)
#0     True
#1     True
#2     True
#3     True
#4    False
#5    False
#6    False
#7    False
#dtype: bool

然后使用这些序列来切片df[~find_drops([1,5], df)]

你看了^{}了吗?默认值为keep=first。所以你可以简单地做:

datatry.loc[datatry['num'].duplicated(), :]

相关问题 更多 >