相当于R函数' ave'在Python熊猫

时间:2015-02-04 09:57:13

标签: python r pandas

我在R中有一个数据框。例如:

d1<-structure(list(A = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L), B = 1:9), .Names     = c("A", 
"B"), class = "data.frame", row.names = c(NA, -9L))

我想输出

d2<-structure(list(A = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L), B = 1:9, 
c = c(3L, 3L, 3L, 7L, 7L, 7L, 7L, 9L, 9L)), .Names = c("A", 
"B", "c"), class = "data.frame", row.names = c(NA, -9L))

我可以使用ave函数在R中执行此操作。

d1$c<-ave(d1$B,d1$A,FUN=max)

现在我想在python中完成它。我的意思是如果我有像d1这样的数据,我如何在python pandas中创建d2?

1 个答案:

答案 0 :(得分:2)

R ave函数(https://stat.ethz.ch/R-manual/R-devel/library/stats/html/ave.html)将函数(默认为平均值)应用于具有相同因子级别的观察组合。

在pandas中,没有开箱即用的功能,但您可以通过groupby操作完成此操作。

从您的数据框开始:

In [86]: df = pd.DataFrame({'A': [1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L], 'B':range(1,10)})

In [87]: df
Out[87]: 
   A  B
0  1  1
1  1  2
2  1  3
3  2  4
4  2  5
5  2  6
6  2  7
7  3  8
8  3  9

您可以添加列C作为A分组的结果,并计算每个组的B的最大值:

In [88]: df['C'] = df.groupby('A').transform(lambda x: pd.Series(x.B.max()))

In [89]: df
Out[89]: 
   A  B  C
0  1  1  3
1  1  2  3
2  1  3  3
3  2  4  7
4  2  5  7
5  2  6  7
6  2  7  7
7  3  8  9
8  3  9  9

注意:我在这里使用transform方法,因为我希望最终得到与原始数据帧相同的索引。

有关pandas中groupby功能的更多信息,请参阅http://pandas.pydata.org/pandas-docs/stable/groupby.html