python - 如何为 Python 中的对象添加 "attach"功能,例如到 Pandas 数据框?

标签 python pandas scala

也许这更像是一个理论语言问题,而不是 Pandas 本身。我有一组功能扩展,我想“附加”到例如一个没有显式调用实用程序函数并将 DataFrame 作为参数传递的 Pandas DataFrame,即具有语法糖。扩展 Pandas DataFrame 也不是一个选择,因为需要定义和链接 DataFrame 构造器的不可访问的类型,例如AxesDtype .
在 Scala 中,可以定义一个隐式类来将功能附加到其他不可用或过于复杂而无法初始化的对象上,例如String 类型不能在 Java AFAIR 中扩展。例如,以下将函数动态附加到 String 类型 https://www.oreilly.com/library/view/scala-cookbook/9781449340292/ch01s11.html

scala> implicit class StringImprovements(s: String) {
    def increment = s.map(c => (c + 1).toChar)
}

scala> val result = "HAL".increment   
result: String = IBM
同样,我希望能够做到:
# somewhere in scope
def lexi_sort(df):
    """Lexicographically sorts the input pandas DataFrame by index and columns""" 
    df.sort_index(axis=0, level=df.index.names, inplace=True)
    df.sort_index(axis=1, level=df.columns.names, inplace=True)
    return df

df = pd.DataFrame(...)
# some magic and then ...
df.lexi_sort()
一种有效的可能性是使用装饰器模式,但我想知道 Python 是否提供了一种像 Scala 那样的样板语言替代品。

最佳答案

在 Pandas 中,您可以执行以下操作:

def lexi_sort(df):
    """Lexicographically sorts the input pandas DataFrame by index and columns"""
    df.sort_index(axis=0, level=df.index.names, inplace=True)
    df.sort_index(axis=1, level=df.columns.names, inplace=True)
    return df

pd.DataFrame.lexi_sort = lexi_sort

df = pd.read_csv('dummy.csv')
df.lexi_sort()
我想对于其他对象,您可以在类中定义一个方法来实现相同的结果。
class A():
    def __init__(self, df:pd.DataFrame):
        self.df = df
        self.n = 0

    def lexi_sort(self):
        """Lexicographically sorts the input pandas DataFrame by index and columns"""
        self.df.sort_index(axis=0, level=self.df.index.names, inplace=True)
        self.df.sort_index(axis=1, level=self.df.columns.names, inplace=True)
        return df

    def add_one(self):
        self.n += 1

a = A(df)
print(a.n)
a.add_one()
print(a.n)

关于python - 如何为 Python 中的对象添加 "attach"功能,例如到 Pandas 数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64174437/

相关文章:

python - Numpy 中的一维 LDA 输出维度

python - 关于 matplotlib 中的子图和子子图位置

python - 将分组结果计数到 pandas 中的单独列中

javascript - 从 Scala.js 访问 JS this

python - 写入文件时出现 UnicodeEncodeError

python - 自动以正确的编码打开文件

python - 比较数据框列中的嵌套列表值

python - 让垂直网格线出现在 matplotlib 的线图中

arrays - Scala 中的 apply() 函数出现编译错误?

mysql - 使用Scala和spark从mysql中提取数据