全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 python论坛
1427 4
2019-02-11
比如现在有一个数据集
name sex height weight
a  m 175 150
b  m 180 130
c   f  160   100
d   f  155   90

我要计算不同性别的平均身高,平均体重,身高/体重比 并且放在一个结果中
用dplyr我可以很简单的直接用
复制代码

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

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


复制代码
请问大家有什么办法可以简单的进行数据聚合并且做一些计算而且可以按照数据框返回结果吗?


二维码

扫码加我 拉你入群

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

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

全部回复
2019-3-5 15:25:35
请问height_weight这个字段是聚合值吗
二维码

扫码加我 拉你入群

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

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

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
二维码

扫码加我 拉你入群

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

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

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
二维码

扫码加我 拉你入群

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

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

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

扫码加我 拉你入群

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

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

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群