也许这更像是一个理论语言问题,而不是 Pandas 本身。我有一组功能扩展,我想“附加”到例如一个没有显式调用实用程序函数并将 DataFrame 作为参数传递的 Pandas DataFrame,即具有语法糖。扩展 Pandas DataFrame 也不是一个选择,因为需要定义和链接 DataFrame 构造器的不可访问的类型,例如Axes
和 Dtype
.
在 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/