在Python的下一行代码中,它是如何工作的?
我想了解一条类似的路线:在Python的下一行代码中,它是如何工作的?,python,dataframe,Python,Dataframe,我想了解一条类似的路线: df.groupBy(someExpr).agg(somAgg).where(somePredicate) 我不知道如何使用Python链接该示例中的方法。我不想完全理解代码的前一行,只想知道其中的一些名称以供调查。我试图复制类似的东西,我很确定这不是一个好的实现,但我写了一个例子,说明我现在是如何想象我想要得到的代码如何在引擎盖下工作的: class Example: def __init__(self, *args): self.list = [a
df.groupBy(someExpr).agg(somAgg).where(somePredicate)
我不知道如何使用Python链接该示例中的方法。我不想完全理解代码的前一行,只想知道其中的一些名称以供调查。我试图复制类似的东西,我很确定这不是一个好的实现,但我写了一个例子,说明我现在是如何想象我想要得到的代码如何在引擎盖下工作的:
class Example:
def __init__(self, *args):
self.list = [arg for arg in args]
def groupBy(self):
self.list = [value for value in self.list if isinstance(value, int)]
return self
def agg(self):
self.list = sum(self.list)
return self
def where(self, elem):
self.list = [value for value in self.list if value == elem]
return self
df = Example("a",1,3,3,5,"C","D")
df.groupBy().where(3).agg().list
我的问题是如何以最佳方式实现方法链?如果每个方法返回不同类型的值,会发生什么?如何将代码行中的
.list
从这里删除df.groupBy().where(3.agg().list
到这个df.groupBy().where(3.agg()
?所以这只是一个包的切割器设置。假设这是隐藏在df下的熊猫数据帧。事实上,每个函数都修改对象并返回它的coppy(因此df被不必要地修改)。因此,这一呼吁可以翻译为:
df_grouped = df.groupBy(someExpr)
df_g_aggregated = df_grouped.agg(somAgg)
df_g_a_filtered = df_g_aggregated.where(somePredicate)
如果您查看定义下的所有返回相同的东西,一个数据帧,那么每个连续的操作都依赖于相同的类。操作顺序将导致不同的结果,但在逻辑上是正确的,不会导致错误,因为group by的返回类型不是GroupedDataFrame,而是带有附加列group的DataFrame
因此,您的代码可能如下所示:
class Example:
def __init__(self, *args):
self.list = [arg for arg in args]
def groupBy(self, key=None):
groups = #calculate groups for this dataset by key column
self.list = zip(self.list, groups)
return self
def agg(self, key=None):
sum = #calculate sum per each value of key column
self.list = zip(self.list, sum)
return self
def where(self, key, elem):
self.list = #filter column key by elem
return self
df = Example("a",1,3,3,5,"C","D")
df.groupBy().where(3).agg().list
当然,我不会在这里实现所有这些函数,但逻辑是总是返回类型应该相同,所以如果您对([…])进行求和,它可能会返回一个整数。
在我的示例中,还有冗余的就地修改,但我希望您能理解要点。这称为方法链接。请注意,每个方法都返回self
,因此您提到的代码行可以按如下方式计算:
df.groupBy().where(3).agg().list
首先,df.groupBy()
df.where(3).agg().list
df.agg().list
df.list
类似地,df。其中(3)
返回df
,并对其进行了修改,因此它变成:
df.where(3).agg().list
df.agg().list
df.list
最后,df.agg()
df.where(3).agg().list
df.agg().list
df.list
最终结果相当于写下:
df = Example("a",1,3,3,5,"C","D")
df.groupBy()
df.where(3)
df.agg()
df.list
你的问题是什么?你不明白哪一部分?看来你的想法是对的?这只是一个例子。另请参见,我建议不要复制,而是直接看源代码,看看实际功能是如何实现的:您可以在repo中搜索您特别想要查看的内容这里没有理论:修改self.list,然后返回self,因为您可以创建链。这不是最好的解决方案,我会在这行代码df.groupBy(someExpr).agg(somAgg).where(somePredicate)中使用基于产量的DSO,名为“where”的方法返回什么?我想避免在我的代码行中使用.list。另外,如何才能使每个方法返回不同类型的值?@EricBellet methodwhere()
返回一个数据帧,其中所有行都满足特定条件。我不知道为什么你会希望这些函数返回不同类型的值,这将使这样的链不可能,除非你做了一些接口,这些函数将是该接口的抽象成员,但它们的行为应该是相同的-这使得实现接口是多余的。