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

col*_*ang 7 python r pandas

假设我有一个有列的数据框x, a, b, c我希望聚合a, b, c以通过函数从x列表中获取值y myfun,然后复制每个窗口/分区中所有行的值.

在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
Run Code Online (Sandbox Code Playgroud)

虽然逻辑很清楚,但我并不是百分之百满意.有没有更好的方法?

我不是很熟悉pandas.在这种情况下有帮助吗?

附带问题:我的问题属于哪个类别?聚合?划分?窗口?这种模式在数据分析中经常发生,必须有一个现有的名称.

Jus*_*tin 9

使用a 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)
Run Code Online (Sandbox Code Playgroud)

具体用法取决于您编写函数的方式myfun.在使用的列是静态的(例如总是x),我写入myfun以获取DataFrame函数内的完整和子集.但是,如果编写函数来接受向量(或pandas Series),则还可以选择列和apply函数:

df.groupby('a')['x'].apply(myfun)
Run Code Online (Sandbox Code Playgroud)

FWIW,pd.Series在您使用时返回对象通常也很方便groupby.


为了回答您的问题,这被称为数据处理的拆分 - 应用 - 组合策略.有关详细信息,请参见此处

  • @agstudy虽然与原始numpy相比有一点开销,但方便却难以击败!它还有一些非常令人愉快的绘图功能(如`df.plot()`),显着降低了python中数据探索的标准 (3认同)