python - pandas - 从列中删除特定序列

标签 python pandas graph sequence networkx

我想从我的专栏中删除特定序列,因为它们出现很多并且没有给我提供很多额外信息。数据库由节点之间的边组成。这样的话,节点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

到目前为止,我删除了一个仅重复自身的序列:

c1 = datatry['num'].eq('1')
c2 = datatry['num'].eq(datatry['num'].shift(1))
datatry2 = datatry[(c1 & ~c2) | ~(c1)]

如何将上面的代码(删除所有重复整数 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

最佳答案

这是一种方法:

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)]

关于python - pandas - 从列中删除特定序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55109138/

相关文章:

python - 在不使用 for 循环的情况下创建数据框的子集

python - pandas DataFrame 在每组的基础上插值/重采样每日数据

python - 使用 AM/PM 和 +UCT 转换时间 (Python)

algorithm - 图中最大化值的最佳路径

c# - 使用 Matlab 从 C# 控制台应用程序创建图形或绘图?

javascript - Highcharts - 突出显示两个 y 值之间的区域

python - `await`在Python3协同多任务处理中吗?

python - 创建 epoll()able 对象

python - 根据给定条件将新列添加到现有数据框列

python - 拆分 pandas 数据框中字符串中的第 n 个元素