Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python的下一行代码中,它是如何工作的?_Python_Dataframe - Fatal编程技术网

在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 method
where()
返回一个数据帧,其中所有行都满足特定条件。我不知道为什么你会希望这些函数返回不同类型的值,这将使这样的链不可能,除非你做了一些接口,这些函数将是该接口的抽象成员,但它们的行为应该是相同的-这使得实现接口是多余的。