如何做R dplyr在熊猫中做的事情?

时间:2017-06-14 12:21:04

标签: python r pandas dplyr

我想将我的pandas DataFrame拆分成组,然后在每个chunk上运行一个复杂的函数。复杂函数为每个块返回一个DataFrame,其中包含任意数量的列和列的名称以及任意数量的行。我希望在操作之后将这些结果DataFrame组合起来。在R中我可以用

执行此操作
library(tibble)
library(dplyr)

df = tribble(
  ~g,  ~c1, ~c2,
  "a",   1,   6,
  "a",   2,   7,
  "b",   3,   8,
  "b",   4,   9,
  "b",   5,  10
)

myfct <- function(x, y){
  data.frame(c1 = x,
             c2 = y,
             res = c(x * y, x + y, x / y),
             type = c('mult', 'add', 'div'))
}

df %>% group_by(g) %>% do(myfct(.$c1, .$c2))

结果为

Source: local data frame [15 x 5]
Groups: g [2]

       g    c1    c2        res   type
   <chr> <dbl> <dbl>      <dbl> <fctr>
1      a     1     6  6.0000000   mult
2      a     2     7 14.0000000    add
3      a     1     6  7.0000000    div
4      a     2     7  9.0000000   mult
5      a     1     6  0.1666667    add
6      a     2     7  0.2857143    div
7      b     3     8 24.0000000   mult
8      b     4     9 36.0000000    add
9      b     5    10 50.0000000    div
10     b     3     8 11.0000000   mult
11     b     4     9 13.0000000    add
12     b     5    10 15.0000000    div
13     b     3     8  0.3750000   mult
14     b     4     9  0.4444444    add
15     b     5    10  0.5000000    div

这当然 - 只是一个例子。

1 个答案:

答案 0 :(得分:5)

我认为您需要apply - 请同时查看flexible apply

def myfct(x):
    print (x)
    return pd.DataFrame({'mult':x['c1'] * x['c2'], 
                          'add':x['c1'] + x['c2'], 
                          'div':x['c1'] / x['c2'],
                          'g':x.name,
                          'c1': x['c1'],
                          'c2':x['c2']})

df = df.groupby('g')['c1','c2'].apply(myfct)
print (df)
   add  c1  c2       div  g  mult
0    7   1   6  0.166667  a     6
1    9   2   7  0.285714  a    14
2   11   3   8  0.375000  b    24
3   13   4   9  0.444444  b    36
4   15   5  10  0.500000  b    50

也可以使用melt

进行重塑
df = df.groupby('g')['c1','c2'].apply(myfct)
       .melt(id_vars=['g','c1','c2'], value_name='res', var_name='type')
print (df)
    g  c1  c2  type        res
0   a   1   6   add   7.000000
1   a   2   7   add   9.000000
2   b   3   8   add  11.000000
3   b   4   9   add  13.000000
4   b   5  10   add  15.000000
5   a   1   6   div   0.166667
6   a   2   7   div   0.285714
7   b   3   8   div   0.375000
8   b   4   9   div   0.444444
9   b   5  10   div   0.500000
10  a   1   6  mult   6.000000
11  a   2   7  mult  14.000000
12  b   3   8  mult  24.000000
13  b   4   9  mult  36.000000
14  b   5  10  mult  50.000000