我正在尝试调整熊猫的合并方法以满足我的需求。基本上,我需要检查合并是否不会导致行数增加,如果合并,请将适当的信息写入记录器。我可以编辑熊猫的源代码,但这显然不是正确的方法。
我试图在自己的模块中使用扩展的DataFrame类和猴子补丁合并来创建自己的合并方法:
pd.DataFrame = myDataFrameWithCustomMerge
如果我使用pd.DataFrame()构造函数创建df,则此方法有效,但这不会覆盖数据框的合并,因为我使用pd.read_sql()
或pd.read_excel()
语法创建了它们。
我还尝试修改sys.module['pandas']
以全局覆盖DataFrame,但这都不起作用。我发现的唯一方法是覆盖源文件中的合并。
答案 0 :(得分:0)
只需创建一个继承自pd.DataFrame
的新类:
class NoMergeDf(pd.DataFrame):
def merge():
print('Overriding!')
df = NoMergeDf(pd.read_excel(path))
df.merge() # prints 'Overriding!'
编辑
如果您不想重构所有内容,则可以创建一个名为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。
最省力的解决方案是编写一个自定义merge(df1, df2)
来完成您想要的事情,然后只需重构调用DataFrame.merge
的部分即可。