【问题标题】:plyr or dplyr in PythonPython 中的 plyr 或 dplyr
【发布时间】:2015-01-08 19:17:15
【问题描述】:

这更像是一个概念问题,我没有具体问题。

我正在学习 Python 进行数据分析,但我对 R 非常熟悉 - R 的一大优点是 plyr(当然还有 ggplot2),甚至更好的 dplyr。 Pandas 当然也有拆分应用,但是在 R 中我可以做类似的事情(在 dplyr 中,在 plyr 中有点不同,我现在可以看到 dplyr 如何模仿对象编程中的 . 符号)

   data %.% group_by(c(.....)) %.% summarise(new1 = ...., new2 = ...., ..... newn=....)

我同时创建多个汇总计算

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

df[...].groupby(.....).sum() only sums columns, 

在 R 上,我可以在一次调用中获得一个均值、一个总和、一个特殊函数等

我意识到我可以单独执行所有操作并将它们合并,如果我使用 python 就可以了,但是当涉及到选择工具时,您不必键入、检查和验证任何代码行时间加起来

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

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

【问题讨论】:

    标签: python r pandas plyr dplyr


    【解决方案1】:

    我认为您正在寻找 agg function,它适用于 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
    

    【讨论】:

    • 这似乎更像是一个评论而不是一个答案。但另一方面,没有提供可重复的示例,所以....也许。作为 R 用户,我很高兴看到 agg-函数与 R 聚合函数不太相似。
    • OP 要求一种同时应用多个聚合函数的方法。一个简短的答案仍然是一个答案。
    • 在引用页面上,看起来可能需要grouped.agg()
    • 好的,用一个例子来整理答案
    • 谢谢你的回答,我不需要一个真实的例子,因为我没有提供一个实际的问题。我明确表示这是一个概念性问题
    【解决方案2】:

    我也是 dplyr for R 的忠实粉丝,并且正在努力提高我对 Pandas 的了解。由于您没有具体问题,我建议您查看下面的帖子,该帖子分解了整个介绍性 dplyr 小插图,并展示了如何使用 Pandas 完成所有这些工作。

    例如,作者用 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)
    

    这是 Pandas 的实现:

    flights.groupby(['year', 'month', 'day'])
       [['arr_delay', 'dep_delay']]
       .mean()
       .query('arr_delay > 30 | dep_delay > 30')
    

    在原帖中有更多关于如何使用 Pandas 实现类似 dplyr 的操作的比较。 http://nbviewer.ipython.org/gist/TomAugspurger/6e052140eaa5fdb6e8c0

    【讨论】:

    • 虽然这可能会回答问题,但it would be preferable 在此处包含答案的基本部分(例如解决问题的示例问题的示例?),并提供链接以供参考。
    • 答案已编辑以包含有关链接的信息,这对于原始发布者关于执行多个汇总计算的观点是必要的。
    【解决方案3】:

    可以简单地使用 Python 中的 dplyr。

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

    dataf = (DataFrame(mtcars).
             filter('gear>3').
             mutate(powertoweight='hp*36/wt').
             group_by('gear').
             summarize(mean_ptw='mean(powertoweight)'))
    

    有一个example in the documentation。文档的这一部分(也是)一个 jupyter 笔记本。寻找页面顶部附近的链接。

    这个问题的另一个答案是比较 R 的 dplyr 和 pandas(参见 @lgallen)。在 rpy2 与 dplyr 的接口中,相同的 R 单线链接 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)
    

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

    【讨论】:

    • 但是你甚至不再使用原生 pandas 数据框了,对吧?
    • @AllenWang 有一些工具可以在内存中的 R 数据帧和 pandas 数据帧(rpy2 中的转换器)之间穿梭。除此之外,原生 pandas 数据帧的概念可能不像考虑持久数据帧(HDF5、(远程)SQL 表、羽毛)时看起来那么严格,因为它们可以从 Python/pandas 或 R 访问(因此Python/rpy2) 作为各自世界中的数据帧。
    【解决方案4】:

    在 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 dfply

    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
    

    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
    

    注意:更多信息您可以查看以下link

    【讨论】:

    • 很棒的工具!是否可以给出一个可重现的示例(无需从某处导入数据?)
    • 一种选择是安装ggplot(在python $ pip install ggplot 中),其中包括不同的数据库,如mtcars,有很多使用dplyr 和这个数据库的例子。
    【解决方案5】:

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

    https://plotnine.readthedocs.io/en/stable/gallery.html

    【讨论】:

      【解决方案6】:

      现在我们有一个关闭端口 dplyr 和其他从 R 到 python 的相关包:

      https://github.com/pwwang/datar

      免责声明:我是包的作者。

      【讨论】:

        猜你喜欢
        • 2016-04-18
        • 1970-01-01
        • 2020-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-25
        • 2014-11-05
        相关资源
        最近更新 更多