假设我有一个有列的数据框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.在这种情况下有帮助吗?
附带问题:我的问题属于哪个类别?聚合?划分?窗口?这种模式在数据分析中经常发生,必须有一个现有的名称.
使用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.
为了回答您的问题,这被称为数据处理的拆分 - 应用 - 组合策略.有关详细信息,请参见此处
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |