删除由多个值匹配的行

时间:2019-02-02 18:29:52

标签: python pandas

我有两个数据帧。一个含有该主数据(称为dtt_main),并且可以是巨大的,而另一个(称为dtt_selected)仅包含两列,它们也是在主数据帧可用。对于每一个条目dtt_selected,我要检查相同的值是否包括在dtt_main。如果是这样,则应删除该行(这些值在dtt_main中不是唯一的,因此可以通过应用此标准来删除多行)。我设法写一个小功能,正是这一点,但实在是太慢了,因为我同时具有遍历两个dataframes。对于更快,更像熊猫的解决方案,我将感到非常高兴。谢谢!

# The real data set contains ~100_000 rows and ~1000 columns
dtt_main = pd.DataFrame({
    'a': [1,1,1,2,2,4,5,4], 
    'b': [1,1,2,2,3,3,4,6], 
    'data': list('abcdefgh')
})

dtt_selected = pd.DataFrame({
    'a': [1,1,2,4], 
    'b': [1,5,3,6]
})

def remove_selected(dtt_main, dtt_selected):
    for row_select in dtt_select.itertuples():
        for row_main in dtt_main.itertuples():
            # First entry of the tuples is the index!
            if (row_select[1] == row_main[1]) & (row_select[2] == row_main[2]):
                dtt_main.drop(row_main[0], axis='rows', inplace=True)

remove_selected(dtt_main, dtt_selected)
print(dtt_main)
>>> a  b data
>>> 2  1  2    c
>>> 3  2  2    d
>>> 5  4  3    f
>>> 6  5  4    g

1 个答案:

答案 0 :(得分:1)

您可以使用pd.merge离开加入DataFrames。通过设置indicator=True,它将添加一列_merge,如果该列也出现在'both'中(因此应该被删除),则将具有dtt_selected;如果存在'left_only'只是在dtt_main(因此应保持)。现在,在下一行中,您可以首先仅保留具有'left_only'的列,然后删除现在不必要的'_merge'列:

df1 = dtt_main.merge(dtt_selected, how='left', indicator=True)
df1[df1['_merge'] == 'left_only'].drop(columns='_merge')
#Output
#   a  b data
#2  1  2    c
#3  2  2    d
#5  4  3    f
#6  5  4    g