【问题标题】:In python, the summarise (dplyr) function analogue在 python 中,summary (dplyr) 函数类比
【发布时间】:2019-10-01 03:21:07
【问题描述】:

我有一个熊猫数据框 df,我想按变量“house”分组,并在其他三个变量中执行特定操作:“var1”、“var2”和“var3”。假设这三个变量是数字变量,并且 'var1' 取值 1、2、3。

data = {'house':['A', 'B', 'A', 'A', 'B', 'B', 'B'], 'var1':[3, 0, 1, 3,4,5,3], 'var2':[2, 0, 5, 1,4,1,3],'var3':[4, 2, 3, 3,0,5,1]}
df = pd.DataFrame(data) 
df

现在,我想创建 3 个新变量

  1. new_var1 = 计算 var3 取值的次数 == 3
  2. new_var2 = sum var2(简单聚合)
  3. new_var3 = sum var3(简单聚合)

如果我使用 R 编程语言,我会立即使用

require(dplyr)
data = data.frame('house'=c('A', 'B', 'A', 'A', 'B', 'B', 'B'), 
        'var1'=c(3, 0, 1, 3,4,5,3), 
        'var2'=c(2, 0, 5, 1,4,1,3),
        'var3'=c(4, 2, 3, 3,0,5,1))

df= data %>% group_by(house) %>% summarise(new_var1 = sum(var1 == 3),
                                       new_var2 = sum(var2),
                                       new_var2 = sum(var2))
df

在python中,首先我分组

df.groupby(['house'])['var1','var2', 'var3']

但我想继续使用同一行代码,但我不知道该怎么做。 python中有一些类似的'summarise'函数吗?

【问题讨论】:

    标签: python r pandas


    【解决方案1】:

    您可以使用agg 方法来做到这一点

    (df.groupby(['house']).agg({'var1': lambda x: (x==3).sum(), 
                                'var2': 'sum',
                                'var3': 'sum'})
       .rename(columns={"var1": "new_var1", 
                        "var2": "new_var2",
                        "var3":"new_var3"})
    )
    

    【讨论】:

    • 好答案,我希望你不介意我重新格式化了一下。另外,使用'sum'x.sum() 可能比sum 快。
    • 这很有趣。如果我删除括号,我会收到错误消息。为什么变量的顺序不是 new_var1、new_var2 和 new_var3?
    • 对不起,现在我意识到括号错误。忽略评论。
    • 括号是必需的,因为代码不止一行。不过,我可以看到变量井然有序
    • 但是变量顺序的问题还是有问题的。
    【解决方案2】:

    我一直在将数据包(dplyrtidyrtibble 等)从R 移植到python

    https://github.com/pwwang/datar

    如果你熟悉 R 中的那些包,并且想在 python 中应用它,那么这里就是为你准备的:

    from datar import f
    from datar.all import *
    
    data = tibble(
      house=c('A', 'B', 'A', 'A', 'B', 'B', 'B'), 
      var1=c(3, 0, 1, 3,4,5,3), 
      var2=c(2, 0, 5, 1,4,1,3),
      var3=c(4, 2, 3, 3,0,5,1)
    )
    
    df= data >> group_by(f.house) >> summarise(new_var1 = sum(f.var1 == 3),
                                               new_var2 = sum(f.var2),
                                               new_var3 = sum(f.var3))
    print(df)
    

    输出:

      house  new_var1  new_var2  new_var3
    0     A         2         8        10
    1     B         1         8         8
    

    【讨论】:

      猜你喜欢
      • 2020-03-20
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多