删除一些包含更多条件的行



我有一个数据帧,如下所示:

start  start_interaction
0     710000          224180000
1     710000               3445
2     715000             760000
3     755000             7603
4     755000             870000
..       ...                ...
149  1840000            1935000
150  1840000            1980000

我有一个清单如下:

myList=[(710000,3445),(755000,7603) ,(77700,234)]

所以我需要删除元组中myList中的第一个元素应该在start列、元组中的第二个元素应该位于start_interaction列的行我想要的最终结果如下:

start  start_interaction
0     710000          224180000
2     715000             760000
4     755000             870000
..       ...                ...
149  1840000            1935000
150  1840000            1980000

所以请告诉我该怎么做。非常感谢。

也许不是最优雅的,但它可以

df = df[[not(x) for x in [any([(row[1].start==x[0]) &(row[1].start_intercation==x[1]) for x in myList]) for row in df.iterrows()]]]

解释:下一行检查特定行";"开始";匹配元组的第一个元素;start_ interaction";匹配列表中任何元组的第二个对象。

[any([(row[1].start==x[0]) &(row[1].start_intercation==x[1]) for x in myList]]

我们为不满足此条件的行筛选df(在列表中的任何项中都没有匹配项(。我们通过过滤不满足上述条件的行的df来做到这一点:

df = df[[not(x) for x in cond]]

其中cond是高于的条件

您可以从列表中创建一个数据帧,用indicator=True执行左merge,并使用left_only指示符构建布尔数组。最后对原始数据帧进行切片:

cols = list(df.columns) # subset here if needed
df2 = pd.DataFrame(myList, columns=cols)
mask = (df.merge(df2, on=cols, how='left', indicator=True)
['_merge'].eq('left_only').values # getting the values as the new index
# is no longer aligned
)
out = df[mask]

输出:

start  start_interaction
0     710000          224180000
2     715000             760000
4     755000             870000
149  1840000            1935000
150  1840000            1980000

最新更新