Python中的plyr或dplyr

Python中的plyr或dplyr,python,r,pandas,plyr,dplyr,Python,R,Pandas,Plyr,Dplyr,这更多的是一个概念性的问题,我没有具体的问题 我正在学习用于数据分析的python,但我非常熟悉R—R的一个伟大之处是plyr(当然还有ggplot2),甚至更好的dplyr。Pandas当然也有split apply,但是在R中我可以这样做(在dplyr中,在plyr中有点不同,现在我可以看到dplyr是如何模仿对象编程中的.notation的) 在其中,我同时创建多个摘要计算 我如何在python中做到这一点,因为 df[...].groupby(.....).sum() only sums

这更多的是一个概念性的问题,我没有具体的问题

我正在学习用于数据分析的python,但我非常熟悉R—R的一个伟大之处是plyr(当然还有ggplot2),甚至更好的dplyr。Pandas当然也有split apply,但是在R中我可以这样做(在dplyr中,在plyr中有点不同,现在我可以看到dplyr是如何模仿对象编程中的.notation的)

在其中,我同时创建多个摘要计算

我如何在python中做到这一点,因为

df[...].groupby(.....).sum() only sums columns, 
在R上,我可以在一次调用中使用一个均值、一个和、一个特殊函数等

我意识到我可以单独完成所有操作并合并它们,如果我使用python,这很好,但当涉及到选择工具时,任何一行代码都不必输入、检查和验证,就能及时相加

此外,在dplyr中,您还可以添加mutate语句,因此在我看来,它的功能更加强大-那么,我对pandas或python缺少什么呢-


我的目标是学习,我花了很多精力学习python,这是一项值得的投资,但问题仍然存在

我认为您正在寻找应用于groupby对象的

从文档中:

In [48]: grouped = df.groupby('A')

In [49]: grouped['C'].agg([np.sum, np.mean, np.std])
Out[49]: 
          sum      mean       std
A                                
bar  0.443469  0.147823  0.301765
foo  2.529056  0.505811  0.96

我也是dplyr的忠实粉丝,我正在努力提高我对熊猫的认识。既然你没有什么特别的问题,我建议你看看下面的帖子,它分解了整个介绍dplyr的小插曲,并展示了如何用熊猫来完成所有这些

例如,作者演示了在R中使用管道操作符进行链接:

 flights %>%
   group_by(year, month, day) %>%
   select(arr_delay, dep_delay) %>%
   summarise(
      arr = mean(arr_delay, na.rm = TRUE),
      dep = mean(dep_delay, na.rm = TRUE)
       ) %>%
   filter(arr > 30 | dep > 30)
以下是熊猫的实施:

flights.groupby(['year', 'month', 'day'])
   [['arr_delay', 'dep_delay']]
   .mean()
   .query('arr_delay > 30 | dep_delay > 30')
关于如何在最初的岗位上实施类似于dplyr的操作,还有更多的比较。

可以简单地使用Python中的dplyr

rpy2(随rpy2-2.7.0引入)中有一个到
dplyr
的接口,允许您编写以下内容:

dataf = (DataFrame(mtcars).
         filter('gear>3').
         mutate(powertoweight='hp*36/wt').
         group_by('gear').
         summarize(mean_ptw='mean(powertoweight)'))
有一个问题。文档的这一部分也是一个jupyter笔记本。查找页面顶部附近的链接

这个问题的另一个答案是比较R的dplyr和熊猫(见@lgallen)。在rpy2与dplyr的接口中,dplyr语句编写的同一个R单行链式语句本质上是相同的

R:

Python+rpy2:

(DataFrame(flights).
 group_by('year', 'month', 'day').
 select('arr_delay', 'dep_delay').
 summarize(arr = 'mean(arr_delay, na.rm=TRUE)',
           dep = 'mean(dep_delay, na.rm=TRUE)').
 filter('arr > 30 | dep > 30'))

在python中使用dplyr最类似的方法是使用dfply包。这里有一个例子

R dplyr

library(nycflights13)
library(dplyr)

flights %>%
  filter(hour > 10) %>% # step 1
  mutate(speed = distance / (air_time * 60)) %>% # step 2
  group_by(origin) %>% # step 3a
  summarize(mean_speed = sprintf("%0.6f",mean(speed, na.rm = T))) %>% # step 3b
  arrange(desc(mean_speed)) # step 4

# A tibble: 3 x 2
  origin mean_speed
  <chr>  <chr>     
1 EWR    0.109777  
2 JFK    0.109427  
3 LGA    0.107362 
Python熊猫

flight_data.loc[flight_data['hour'] > 10, 'speed'] = flight_data['distance'] / (flight_data['air_time'] * 60)
result = flight_data.groupby('origin', as_index=False)['speed'].mean()
result.sort_values('speed', ascending=False)

Out[2]: 
  origin     speed
0    EWR  0.109777
1    JFK  0.109427
2    LGA  0.107362

注意:有关更多信息,您可以查看以下内容。

对于dplyr,我使用dfply,它具有相同的语法,但我们使用'>>'作为管道操作符,而在dplyr中我们使用%>% 您可以将plotnine用作ggplot2。我没有共享dfply的代码,因为上面已经共享了该代码,但是您可以查看下面的plotnine链接


这似乎更像是一个评论,而不是一个答案。但另一方面,没有提供可复制的exampel,因此。。。。也许。作为一个R用户,我很高兴看到
agg
-函数与R聚合函数不太相似。OP询问了一种同时应用多个聚合函数的方法。一个简短的答案仍然是一个答案。在引用的页面上,看起来可能需要
grouped.agg()
。好的,我会用一个例子来整理答案谢谢你的答案,我不需要一个真实的例子,因为我没有提供实际问题。我明确表示这是一个概念性问题,虽然这可能会回答问题,但在这里包括答案的基本部分(例如,解决问题样本问题的示例?),并提供链接以供参考。答案经过编辑以包含有关链接的信息,这对于原始海报关于执行多个摘要计算的观点是必要的。但是,你甚至不再使用本机pandas数据帧了,对吗?@AllenWang有一些工具可以在内存中的R数据帧和pandas数据帧(rpy2中的转换器)之间穿梭。除此之外,本机pandas数据帧的概念可能没有考虑持久数据帧(HDF5,(远程)SQL表,feather)时严格,因为它们可以从Python/pandas或R(因此Python/rpy2)作为各自世界中的数据帧访问。很棒的工具!是否可以给出一个可复制的示例(无需从msomewhere导入数据?)一个选项是安装
ggplot
(在python$pip install ggplot中),其中包括不同的数据库,如
mtcars
,有许多使用dplyr的示例。
library(nycflights13)
library(dplyr)

flights %>%
  filter(hour > 10) %>% # step 1
  mutate(speed = distance / (air_time * 60)) %>% # step 2
  group_by(origin) %>% # step 3a
  summarize(mean_speed = sprintf("%0.6f",mean(speed, na.rm = T))) %>% # step 3b
  arrange(desc(mean_speed)) # step 4

# A tibble: 3 x 2
  origin mean_speed
  <chr>  <chr>     
1 EWR    0.109777  
2 JFK    0.109427  
3 LGA    0.107362 
from dfply import *
import pandas as pd

flight_data = pd.read_csv('nycflights13.csv')

(flight_data >>
  mask(X.hour > 10) >> # step 1
  mutate(speed = X.distance / (X.air_time * 60)) >> # step 2
  group_by(X.origin) >> # step 3a
  summarize(mean_speed = X.speed.mean()) >> # step 3b
  arrange(X.mean_speed, ascending=False) # step 4
)


Out[1]: 
  origin  mean_speed
0    EWR    0.109777
1    JFK    0.109427
2    LGA    0.107362
flight_data.loc[flight_data['hour'] > 10, 'speed'] = flight_data['distance'] / (flight_data['air_time'] * 60)
result = flight_data.groupby('origin', as_index=False)['speed'].mean()
result.sort_values('speed', ascending=False)

Out[2]: 
  origin     speed
0    EWR  0.109777
1    JFK  0.109427
2    LGA  0.107362