我在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?
答案 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