Ben*_*Ben 4 python inheritance class dataframe pandas
第一个问题:
我正在使用 pandas 的 DataFrame,并且经常运行相同的例程作为数据预处理和其他操作的一部分。我想将其中一些例程编写为名为ExtendedDataframe
extends 的类中的方法pandas.DataFrame
。我不知道该怎么办。到目前为止,我没有__init__
在新类中编写任何内容,因此它继承自pandas.DataFrame
:
import pandas
class ExtendedDataframe(pandas.DataFrame):
def some_method(self):
blahblah
Run Code Online (Sandbox Code Playgroud)
这显然使我能够通过继承创建一个实例ExtendedDataframe
。但我通常通过类似pandas.read_csv
返回经典DataFrame
. 除了标准提供的方法之外,我怎样才能加载此类 csv 数据并在某个时候将其转换为ExtendedDataframe
使用我自己的方法DataFrame
?如果加载阶段返回一个标准DataFrame
,然后我将其转换为ExtendedDataframe
.
第二个问题:
并非我使用的所有 pandas 功能都是 DataFrame 方法。pandas.merge
有些是以DataFrames 作为参数的函数,例如。如何将此类函数的使用扩展到我的ExtendedDataframe
类的实例?换句话说,如果df1
和df2
是 的两个实例ExtendedDataframe
,我该如何制作
pandas.merge([df1, df2], ...)
Run Code Online (Sandbox Code Playgroud)
就像使用DataFrame
?的标准实例一样工作
这并不能直接回答您的问题,但它是您问题的潜在答案。很多人在他们的工作流程中使用管道方法。
https://pandas.pydata.org/pandas-docs/stable/ generated/pandas.DataFrame.pipe.html
而不是说
df = foo(df)
Run Code Online (Sandbox Code Playgroud)
你可以说
df = df.pipe(foo)
Run Code Online (Sandbox Code Playgroud)
您甚至可以为函数指定参数!这比尝试封装整个数据帧类更容易维护。所以我们的想法是,您可以创建一个函数库并根据需要对它们进行管道传输。
今天遇到了同样的问题,在同事的帮助下,我发现这是有效的:
import pandas as pd
class MyDF(pd.DataFrame):
def __init__(self, *args, **kwargs):
super(MyDF, self).__init__(*args, **kwargs)
@property
def _constructor(self):
return MyDF
def my_custom_method(self):
print('This actually works!')
Run Code Online (Sandbox Code Playgroud)
例子:
df = MyDF(columns=('a', 'b'))
df = df.append({'a': 1, 'b': 'test'})
print(df)
df.my_custom_method() # prints "This actually works!"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9323 次 |
最近记录: |