如何覆盖熊猫的合并方法?

时间:2018-09-06 08:20:25

标签: python pandas

我正在尝试调整熊猫的合并方法以满足我的需求。基本上,我需要检查合并是否不会导致行数增加,如果合并,请将适当的信息写入记录器。我可以编辑熊猫的源代码,但这显然不是正确的方法。

我试图在自己的模块中使用扩展的DataFrame类和猴子补丁合并来创建自己的合并方法:

pd.DataFrame = myDataFrameWithCustomMerge

如果我使用pd.DataFrame()构造函数创建df,则此方法有效,但这不会覆盖数据框的合并,因为我使用pd.read_sql()pd.read_excel()语法创建了它们。

我还尝试修改sys.module['pandas']以全局覆盖DataFrame,但这都不起作用。我发现的唯一方法是覆盖源文件中的合并。

1 个答案:

答案 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_sqlread_excel的位置。

编辑2

我刚刚意识到上面的方法也意味着包装所有其他DataFrame方法,因为像df = df[[col1, col2]]这样的重新分配都会将df还原为熊猫DataFrame。

最省力的解决方案是编写一个自定义merge(df1, df2)来完成您想要的事情,然后只需重构调用DataFrame.merge的部分即可。

相关问题