什么是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有什么优势?速度(数据表很好…)?内存使用情况?是否值得转换,或者至少两者都知道?