Python Pandas中与R函数“ave”等价的函数是什么?

4

I have a dataframe in R. Example:

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))

我可以使用 R 中的 ave 函数来完成这个任务。
d1$c<-ave(d1$B,d1$A,FUN=max)

现在我想用Python实现。我的意思是,如果我有像d1这样的数据,我该如何在Python Pandas中创建d2呢?


不行先生...不能做。请阅读[询问]。 - sarveshseri
我在Pandas中有一个数据框(DataFrame)。我不太同意,那是R中的DataFrame。请展示一下Pandas的DataFrame和期望的输出结果。我对这两列以(3L,3L,3L,7L,7L,7L,7L,9L,9L)方式进行比较,还有点困惑。 - Andy Hayden
1个回答

3

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

在pandas中,没有这样的功能可以直接使用,但是您可以通过groupby操作来实现。

从您的数据框开始:

In [86]: df = pd.DataFrame({'A': [1, 1, 1, 2, 2, 2, 2, 3, 3], '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

你可以通过对A进行分组并计算每个组的B的最大值,将列C添加为结果:
In [88]: df['C'] = df.groupby('A')['B'].transform('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

注意:我在这里使用转换方法,因为我希望最终得到与原始数据框相同的索引。
有关pandas中groupby功能的更多信息,请参见http://pandas.pydata.org/pandas-docs/stable/groupby.html

非常感谢你,Joris。 - kondal
2
@joris 我遇到了“Series object has no attribute”错误,但这个可以正常工作:df['C'] = df.groupby('A').B.transform('max') - RTrain3k
@RTrain3k 谢谢,显然pandas在这里的行为有所改变,而且你的替代方案更好,因此我已经更新了答案。 - joris

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