【问题标题】:attach functions to pandas将函数附加到熊猫
【发布时间】:2015-03-14 00:30:57
【问题描述】:

这可能是一个非常基本的问题(如果有人反对,我可以删除它)。

假设我有一个在不同项目中重复使用多次的函数:

def sort_clean(x, sort_cols):
   x.sort(sort_cols, inplace=True)
   x.reset_index(inplace=True, drop=True)

我想让它成为pandas 模块的一部分,这样每当我执行import pandas 并定义一个数据框myDf 时,我就可以获得mfDf.sort_clean 作为该数据框的可用函数。这可能吗?

【问题讨论】:

    标签: python-3.x pandas


    【解决方案1】:

    你可以继承一个DataFrame

    class NewDataFrame(pandas.DataFrame):
        def sort_clean(self, sort_cols):
            self.sort(sort_cols, inplace=True)
            self.reset_index(inplace=True, drop=True)
    

    例如:

    In [25]: class NewDataFrame(pandas.DataFrame):
       ....:     def sort_clean(self, sort_cols):
       ....:         self.sort(sort_cols, inplace=True)
       ....:         self.reset_index(inplace=True, drop=True)
       ....:         
    
    In [26]: dfrm
    Out[26]: 
              A         B         C
    0  0.382531  0.287066  0.345749
    1  0.725201  0.450656  0.336720
    2  0.146883  0.266518  0.011339
    3  0.111154  0.190367  0.275750
    4  0.757144  0.283361  0.736129
    5  0.039405  0.643290  0.383777
    6  0.632230  0.434664  0.094089
    7  0.658512  0.368150  0.433340
    8  0.062180  0.523572  0.505400
    9  0.287539  0.899436  0.194938
    
    [10 rows x 3 columns]
    
    In [27]: my_df = NewDataFrame(dfrm) 
    
    In [28]: my_df.sort_clean(["B", "C"])
    
    In [29]: my_df
    Out[29]: 
              A         B         C
    0  0.111154  0.190367  0.275750
    1  0.146883  0.266518  0.011339
    2  0.757144  0.283361  0.736129
    3  0.382531  0.287066  0.345749
    4  0.658512  0.368150  0.433340
    5  0.632230  0.434664  0.094089
    6  0.725201  0.450656  0.336720
    7  0.062180  0.523572  0.505400
    8  0.039405  0.643290  0.383777
    9  0.287539  0.899436  0.194938
    
    [10 rows x 3 columns]
    

    但请注意,使用任何返回新 DataFrame 对象的函数都不会自动返回 NewDataFrame

    普通的猴子补丁(例如,只在现有的 DataFrame 实例上创建一个新属性,如 df.sort_clean = sort_clean)会很棘手,因为该方法需要作为隐式第一个参数提供的实例值,特别是因为您就地执行了突变。为此,您必须经常使用 functools.partial 或带有默认值的 lambda 来实现相同的目的:

    df.sort_clean = lambda sort_cols, x=df: sort_clean(x, sort_cols)
    

    请注意,使用lambda 方法时,您需要指定具有默认最后值的参数(在 Python 中,具有默认值的参数必须跟在没有默认值的参数之后)。如果您选择改用functools.partial,则可以解决此问题。

    import functools
    df.sort_clean = functools.partial(sort_clean, df)
    

    【讨论】:

    • 谢谢。我不知道这个词叫做“猴子补丁”。我刚用谷歌搜索了一下,在 pandas 文档pandas.pydata.org/pandas-docs/dev/… 上找到了一个链接
    • 猴子补丁确实不是解决这类问题的好方法。如果它对你有用,那么一定要使用它,但这是一种非常不安全的技术,通常会导致在代码中乱扔各种额外的代码来检查猴子补丁是否正确应用,如果不正确则重新应用它.
    • 我知道,但我经常写一些脚本,这可能会减少我的工作量
    • 虽然我同意猴子修补通常是可以避免的,但我不明白为什么它很棘手。 pd.DataFrame.sort_clean = sort_clean 会正常工作(tm)。
    • @Mr.F:我不明白您对“x 参数的默认值”的担忧。将函数添加到 DataFrame 本身后,self 作为第一个参数传递(函数调用“x”,这无关紧要),它的行为应如此。自己尝试一下,因为这可能比我说的任何话都更有说服力。
    猜你喜欢
    • 2018-02-08
    • 2017-06-13
    • 2014-01-03
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2019-01-14
    • 2018-05-24
    • 2021-09-24
    相关资源
    最近更新 更多