我有两个这样的数据框
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
中的所有行,其中A
,B
和C
与df2
中的值相同,因此在上面预期结果是
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或更多列才能删除。
答案 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')]