<p>可以使用<a href="http://pandas.pydata.org/pandas-docs/stable/internals.html#override-constructor-properties" rel="nofollow noreferrer">constructor-override properties</a>确保pandas操作返回新类的实例。一个简单的例子:</p>
<pre><code>class MyDF(pandas.DataFrame):
@property
def _constructor(self):
return MyDF
def myMethod(self):
return "I am cool"
>>> d = MyDF([[1, 2, 3], [4, 5, 6], [7, 8, 9]], columns=["A", "B", "C"])
>>> d.filter(["A", "B"]).apply(lambda c: c**2).myMethod()
'I am cool'
</code></pre>
<p>当然,如果您还想处理Series,您还必须创建自己的Series子类,并可能定义<a href="http://pandas.pydata.org/pandas-docs/stable/internals.html#define-original-properties" rel="nofollow noreferrer">custom data slots</a>。在</p>
<p>也就是说,我不清楚你的例子是否真的值得这样做。您已经可以将方法调用链接到普通的数据帧上,因此,如果您只想保存一些中间阶段,则不必太麻烦:</p>
^{pr2}$
<p>(由于我在评论中提到的问题,我改变了过滤器的顺序。先过滤到较小的子集,然后再过滤到较大的子集是没有意义的;较大的子集稍后将不存在,因为其中一些已经被过滤掉了。)</p>
<p>仅仅是将东西写成方法链的能力本身并不是一种优势。我特别怀疑像你的<code>.saveToHivePartition</code>这样的链接方法,这些方法可能只是因为它们的副作用才被调用的。当方法以装配线的方式运行时,将它们链接起来是有意义的,每个方法都接受前一个方法的输入并将其修改为传递给下一个方法。只是返回一个对象并不能使代码更具可读性。在</p>
<p>另外,请注意,此解决方案是针对熊猫的。一般来说,如果某些库中的类创建另一个实例,则必须仔细设计该库,以允许以保留类之间关系的方式进行子类化。Pandas已经用我描述的构造函数重写机制完成了这项工作,但它并不总是那样,而且在此之前,很难完成您正在尝试的操作。在</p>