楼主: 慕目穆木
1481 4

请问python中如何实现类似于R中dplyr的聚合功能,并且可以返回多个计算结果? [推广有奖]

  • 0关注
  • 1粉丝

已卖:20份资源

硕士生

20%

还不是VIP/贵宾

-

威望
0
论坛币
56 个
通用积分
0.0001
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
5016 点
帖子
91
精华
0
在线时间
150 小时
注册时间
2016-9-8
最后登录
2019-2-25

楼主
慕目穆木 学生认证  发表于 2019-2-11 21:02:14 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
比如现在有一个数据集
name sex height weight
a  m 175 150
b  m 180 130
c   f  160   100
d   f  155   90

我要计算不同性别的平均身高,平均体重,身高/体重比 并且放在一个结果中
用dplyr我可以很简单的直接用
  1. df%>%group_by(sex)%>%      summarize(mean_weight=mean(weight),mean_height=mean(height),height_weight=height/weight)
复制代码

来让他们的结果作为一个数据框返回

但是用python的groupby 我最多只能同时返回身高和体重的均值,像这种要做额外计算的话我提前需要自定义一个函数function,并且最终也只能返回一个字典


  1. def function(df):
  2.    weight=mean(df.weight)
  3.    height=mean(df.height)
  4.    weight_height=mean(weight/height)
  5.    return({'mean_weight':weight,'mean_height':mean_height,'weight_height':weight_height})
复制代码
请问大家有什么办法可以简单的进行数据聚合并且做一些计算而且可以按照数据框返回结果吗?


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python dplyr 如何实现 summarize function

沙发
詹惠儿 发表于 2019-3-5 15:25:35
请问height_weight这个字段是聚合值吗

藤椅
hexixing 发表于 2019-3-10 09:32:49
在dataframe 中新建身高体重比列df['h/w']=df['height']/df['weight'],然后用df.groupby('sex').mean()就会出来按sex分组的身高、体重、身高体重比的平均值,结果是一个数据框。
In [43]:
      df.groupby('sex').mean()                                          
Out[43]:
     height  weight       h/w
sex                          
f     157.5    95.0  1.661111
m     177.5   140.0  1.275641
如果想同时出现更多的函数,比如标准差,可以
In[39]:
          df.query("sex=='f'").apply([np.mean,np.std])                       
Out[39]:
          height     weight       h/w
mean  157.500000  95.000000  1.661111
std     3.535534   7.071068  0.086424
df.query("sex=='m'").apply([np.mean,np.std])                       
Out[40]:
          height      weight       h/w
mean  177.500000  140.000000  1.275641
std     3.535534   14.142136  0.154113

In[40]
          df.query("sex=='m'").apply([np.mean,np.std])                       
Out[40]:
          height      weight       h/w
mean  177.500000  140.000000  1.275641
std     3.535534   14.142136  0.154113

板凳
hexixing 发表于 2019-3-10 10:19:22
或者一个更快的方法,利用dateframe 自带的describe属性,
df.groupby('sex').apply(lambda x:x.describe())
结果       
                                     ht        wt        h/w
sex                               
f        count        3.000000        3.000000        3.000000
       mean        166.666667        62.333333        2.690519
       std        3.511885        6.429101        0.244372
      min        163.000000        55.000000        2.492537
     25%        165.000000        60.000000        2.553961
     50%        167.000000        65.000000        2.615385
    75%        168.500000        66.000000        2.789510
    max        170.000000        67.000000        2.963636
m        count        3.000000        3.000000        3.000000
       mean        166.666667        60.000000        2.813692
       std        16.072751        6.000000        0.553563
     min        155.000000        54.000000        2.348485
    25%        157.500000        57.000000        2.507576
    50%        160.000000        60.000000        2.666667
   75%        172.500000        63.000000        3.046296
    max        185.000000        66.000000        3.425926
如果觉得默认函数太多,可以参照此方式自行编写函数
df.groupby('sex').apply(lambda x:pd.DataFrame({'mean':np.mean(x),'std':np.std(x)}))
结果:
                           mean        std
sex                       
f        ht        166.666667        2.867442
       wt        62.333333        5.249339
     h/w        2.690519               0.199529
m        ht        166.666667        13.123346
       wt        60.000000        4.898979
     h/w        2.813692                0.451982

报纸
hexixing 发表于 2019-3-10 10:36:44
hadley 虽然搞出一个‘tidyverse',但那个语法真心奇葩,数据预处理和数据清洗,还是老老实实用pandas 吧。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-5 13:32