大熊猫-从列

时间:2019-03-11 19:36:20

标签: 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

2 个答案:

答案 0 :(得分:1)

这是一种方法:

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

答案 1 :(得分:0)

您看过duplicated吗?默认值为keep=first。所以你可以简单地做:

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