如何从一个数据框中删除属于另一数据框的所有行?

时间:2020-07-09 10:25:19

标签: python pandas

我有两个这样的数据框

import pandas as pd

df1 = pd.DataFrame(
    {
        'A': list('abcaewar'),
        'B': list('ghjglmgb'),
        'C': list('lkjlytle'),
        'ignore': ['stuff'] * 8
    }
)

df2 = pd.DataFrame(
    {
        'A': list('abfu'),
        'B': list('ghio'),
        'C': list('lkqw'),
        'stuff': ['ignore'] * 4
    }
)

,我想删除df1中的所有行,其中ABCdf2中的值相同,因此在上面预期结果是

   A  B  C ignore
0  c  j  j  stuff
1  e  l  y  stuff
2  w  m  t  stuff
3  r  b  e  stuff

实现这一目标的一种方法是

comp_columns = ['A', 'B', 'C']
df1 = df1.set_index(comp_columns)
df2 = df2.set_index(comp_columns)

keep_ind = [
    ind for ind in df1.index if ind not in df2.index
]

new_df1 = df1.loc[keep_ind].reset_index()

有人能看到一种更直接的方法来避免reset_index()操作和避免标识非重叠索引的循环,例如通过集市掩饰?理想情况下,我不必对这些列进行硬编码,但是可以在上面的列表中定义它们,因为有时我需要2、3或4或更多列才能删除。

1 个答案:

答案 0 :(得分:1)

使用DataFrame.merge和可选参数 this.getAllPartners() this.getAllUoms(); this.getAllproductsByLocation(); this.getAllLocations(); this.getAllOperationTypes(); ,然后使用布尔掩码来过滤indicator=True中的行:

df1

结果:

df3 = df1.merge(df2[['A', 'B', 'C']], on=['A', 'B', 'C'], indicator=True, how='left')
df3 = df3[df3.pop('_merge').eq('left_only')]