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