我有一个数据帧,如下所示:
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