我想从我的专栏中删除特定序列,因为它们出现了很多,并且没有给我太多额外的信息。数据库由节点之间的边组成。在这种情况下,节点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
答案 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(), :]