使用pandas dataframe如何等价于R中的data.table?

5

在pandas数据框中,是否有类似于R data.table中使用“by”的等效方法?

例如,在R中我可以这样做:

DT = data.table(x = c('a', 'a', 'a', 'b', 'b', 'b'), y = rnorm(6))
DT[, z := mean(y[1:2]), by = x]

在pandas中有类似的功能吗?

1
你可以在这里检查 [http://pandas.pydata.org/pandas-docs/stable/groupby.html] 或者在这里 [https://dev59.com/gl0a5IYBdhLWcg3whI4b] 查看。 - akrun
1
输出是什么? - jezrael
2
如果我理解正确,您需要使用 df.groupby('x')['y'].mean() - jezrael
做到了,谢谢。 - rnorthcott
离题一下...另一种简单的方法是使用R来完成工作,然后将结果推送到Python环境中。请查看rpy2包提供的可能性。如果您正在使用Jupyter笔记本,则还可以使用rmagic单元格在R和Python之间执行操作,并在同一个笔记本中在两个环境之间“推拉”变量 - 非常酷! - n1k31t4
1个回答

5
如果我们需要获得与 data.table 中类似的输出,即按 'x' 分组并获取 'y' 的第一个元素,并创建一个新列 'z',那么:
mean1 = lambda x: x.head(2).mean()
df['z'] = df['y'].groupby(df['x']).transform(mean1)
print(df)
#   x         y         z
#0  a  1.329212  0.279589
#1  a -0.770033  0.279589
#2  a -0.316280  0.279589
#3  b -0.990810 -1.030813
#4  b -1.070816 -1.030813
#5  b -1.438713 -1.030813

使用原帖中的data.table代码在R

library(data.table)
DT[, z := mean(y[1:2]), by = x]
DT
#   x         y          z
#1: a  1.329212  0.2795895
#2: a -0.770033  0.2795895
#3: a -0.316280  0.2795895
#4: b -0.990810 -1.0308130
#5: b -1.070816 -1.0308130
#6: b -1.438713 -1.0308130

数据

import pandas as pd
import numpy as np
from numpy import random

np.random.seed(seed=24)
df = pd.DataFrame({'x': ['a', 'a', 'a', 'b', 'b', 'b'], 
               'y': random.randn(6)})


DT <- structure(list(x = c("a", "a", "a", "b", "b", "b"),
y = c(1.329212, 
-0.770033, -0.31628, -0.99081, -1.070816, -1.438713)), .Names = c("x", 
"y"), class = c("data.table", "data.frame"), 
  row.names = c(NA, -6L))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接