Просто создайте новый класс, который наследуется от pd.DataFrame
:
class NoMergeDf(pd.DataFrame):
def merge():
print('Overriding!')
df = NoMergeDf(pd.read_excel(path))
df.merge() # prints 'Overriding!'
EDIT
если вы не хотите проводить рефакторинг всего, вы можете создать модуль с именем pd2
:
import pandas as pd
class NoMergeDf(pd.DataFrame):
def merge():
print('Overriding!')
def read_sql(*args, **kwargs):
return NoMergeDf(pd.read_sql(*args, **kwargs))
def read_excel(*args, **kwargs):
return NoMergeDf(pd.read_excel(*args, **kwargs))
Тогда вам нужно только изменить места, где называются read_sql
и read_excel
.
РЕДАКТИРОВАТЬ 2
Я только что понял, что вышеупомянутое означает также обертывание любого другого метода DataFrame, потому что любое переназначение, такое как df = df[[col1, col2]]
, вернет df
в DataFrame pandas.
Решение, которое вызывает наименьшую боль, заключается в написании пользовательского merge(df1, df2)
, который делает то, что вы хотите, а затем просто рефакторинг частей, где вы вызываете DataFrame.merge
.