我有两个数据帧。一个含有该主数据(称为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
答案 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