Python 如何做R-dplyr';熊猫有什么特点?
我想将我的pandas数据帧分成几个组,然后在每个块上运行一个复杂的函数。复杂函数为每个块返回一个数据帧,其中包含任意数量的列和名称以及任意数量的行。我希望在操作后合并这些结果数据帧。在R中,我可以用Python 如何做R-dplyr';熊猫有什么特点?,python,pandas,Python,Pandas,我想将我的pandas数据帧分成几个组,然后在每个块上运行一个复杂的函数。复杂函数为每个块返回一个数据帧,其中包含任意数量的列和名称以及任意数量的行。我希望在操作后合并这些结果数据帧。在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 )
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))
库(TIBLE)
图书馆(dplyr)
df=tribble(
~g,~c1,~c2,
“a”、1、6、,
“a”、2、7、,
“b”、3、8、,
“b”、4、9、,
“b”、5、10
)
myfct%按(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
来源:本地数据帧[15 x 5]
分组:g[2]
g c1 c2 res型
1600万公吨
2 a 2 7 14.0000000添加
3 a 1 670000000 div
4A2790000000多辆
5 a 16 0.1666667增补
6 a 27 0.2857143分区
7 b 3 8 24.0000000 mult
8 b 4 9 36.0000000加上
9 b 5 10 50.0000000分区
10B38110000000公吨
11 b 4 9 13.0000000添加
12 b 5 10 15.0000000分区
13 b 3 8 0.3750000 mult
14 b 4 9 0.444增补
15 b 5 10 0.5000000分区
当然,这只是一个例子。我认为您需要
应用
-同时检查:
对于重塑,也可以使用:
我认为您需要
应用
-同时检查:
对于重塑,也可以使用:
好的,我认为这是朝着正确方向迈出的一步,但我再也看不到groupby专栏了。我们能把它带回来吗?好的,我认为这是朝着正确方向迈出的一步,但我再也看不到groupby专栏了。我们能把它带回来吗?
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
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