什么是pythonic方法在R中执行dt[,y:=myfun(x),by=list(a,b,c)]?

什么是pythonic方法在R中执行dt[,y:=myfun(x),by=list(a,b,c)]?,python,r,pandas,Python,R,Pandas,假设我有一个数据框,其中包含列x,a,b,c,我想通过函数myfun对a,b,c进行聚合,从x列表中获得一个值y,然后为每个窗口/分区内的所有行复制该值 在R中的data.table这只是一行:dt[,y:=myfun(x),by=list(a,b,c)] 在Python中,我想到的唯一方法是执行以下操作: # To simulate rows in a data frame class Record: def __init__(self, x, a, b, c):

假设我有一个数据框,其中包含列
x,a,b,c
,我想通过函数
myfun
a,b,c
进行聚合,从x列表中获得一个值y,然后为每个窗口/分区内的所有行复制该值

在R中的
data.table
这只是一行:
dt[,y:=myfun(x),by=list(a,b,c)]

在Python中,我想到的唯一方法是执行以下操作:

 # To simulate rows in a data frame
 class Record:
      def __init__(self, x, a, b, c):
           self.x = x
           self.a = a
           self.b = b
           self.c = c

 # Assume we have a list of Record as df
 mykey = attrgetter('a', 'b', 'c')
 for key, group_iter in itertools.groupby(sorted(df, key=mykey), key=mykey):
     group = list(group_iter)
     y = myfun(x.x for x in group)
     for x in group:
         x.y = y
虽然逻辑很清楚,但我并不是100%满意。有没有更好的办法

我对熊猫不太熟悉。在这种情况下有帮助吗


旁白:我的问题属于哪一类?聚合?隔断窗户?这种模式在数据分析中非常频繁,必须有一个现有的名称。

使用
DataFrame
及其
groupby
方法,从
pandas

import pandas as pd
df = pd.DataFrame({'a': ['x', 'y', 'x', 'y'],
                   'x': [1, 2, 3, 4]})

df.groupby('a').apply(myfun)
确切的用法取决于您如何编写函数
myfun
。如果使用的列是静态的(例如总是
x
),我写
myfun
,以获取函数中的完整
数据帧和子集。但是,如果将函数编写为接受向量(或
系列
),也可以选择列并
将函数应用于该列:

df.groupby('a')['x'].apply(myfun)
FWIW,当您使用
groupby
时,返回
pd.Series
对象通常也很方便



为了回答您的附带问题,这被称为数据处理的拆分-应用-组合策略。有关更多信息,请参阅。

@agstudy与原始numpy相比,虽然有一点开销,但它的便利性是无与伦比的!它还有一些非常令人愉快的绘图功能(如
df.plot()
),大大降低了pythonthanks中数据探索的门槛。我用你的例子尝试了d.plot(),但它不起作用(看起来他想要一个数字向量..没有隐式强制)。我会看得更深入。@agstudy我并不是说我的示例可以工作,但是,它应该画一条线,其中x轴是索引(1,2,3..),y轴是
x
列。python(ipython,pandas,…)比R有什么优势?速度(数据表很好…)?内存使用情况?是否值得转换,或者至少两者都知道?