贝贝嫲嫲 發表於 2019-7-20 15:09:00

python中groupby函数详解(非常容易懂)

<h2>一、groupby 能做什么?</h2>
<p><span style="text-decoration: underline; font-size: 18pt; background-color: rgba(255, 255, 0, 1)"><strong><em>python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算!</em></strong></span></p>
<p><span style="line-height: 1.5">对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下:</span></p>
<p><span style="text-decoration: underline; font-size: 14pt"><em><strong><span style="color: rgba(255, 0, 0, 1); text-decoration: underline">df[](指输出数据的结果属性名称).groupby(,df[属性])(指分类的属性,数据的限定定语,可以有多个).mean()(对于数据的计算方式——函数名称)</span></strong></em></span><br>举例如下:<br>print(df["评分"].groupby(,df["类型"]]).mean())<br>#上面语句的功能是输出表格所有数据中不同地区不同类型的评分数据平均值</p>
<h2>二、单类分组</h2>
<div class="highlight">
<pre><code class="language-text">A.groupby("性别")</code></pre>
</div>
<p><img class="origin_image zh-lightbox-thumb lazy lazyload" alt="" width="1185" data-rawwidth="1185" data-rawheight="548" data-original="https://pic3.zhimg.com/v2-eaa6761d89efb1a4b215d5697f9aa9de_r.jpg" data-actualsrc="https://pic3.zhimg.com/v2-eaa6761d89efb1a4b215d5697f9aa9de_b.png" data-src="https://pic3.zhimg.com/80/v2-eaa6761d89efb1a4b215d5697f9aa9de_hd.png"></p>
<p class="ztext-empty-paragraph">&nbsp;</p>
<p>首先,我们有一个变量A,数据类型是DataFrame</p>
<p>想要按照【性别】进行分组</p>
<p>得到的结果是一个Groupby对象,还没有进行任何的运算。</p>
<p class="ztext-empty-paragraph">&nbsp;</p>
<h2><span style="font-size: 18pt"><strong><span style="background-color: rgba(255, 255, 0, 1)">describe()</span></strong></span></h2>
<p><span style="font-size: 18pt"><strong><span style="background-color: rgba(255, 255, 0, 1)">描述组内数据的基本统计量</span></strong></span></p>
<div class="highlight">
<pre><code class="language-text">A.groupby("性别").describe().unstack()</code></pre>
</div>
<p><img class="origin_image zh-lightbox-thumb lazy lazyload" alt="" width="1407" data-rawwidth="1407" data-rawheight="299" data-original="https://pic1.zhimg.com/v2-88fa7492666c739cc813858d4e3715dc_r.jpg" data-actualsrc="https://pic1.zhimg.com/v2-88fa7492666c739cc813858d4e3715dc_b.png" data-src="https://pic1.zhimg.com/80/v2-88fa7492666c739cc813858d4e3715dc_hd.png"></p>
<p>* 只有数字类型的列数据才会计算统计</p>
<p>* 示例里面数字类型的数据有两列 【班级】和【身高】</p>
<p class="ztext-empty-paragraph">&nbsp;</p>
<p>但是,我们并不需要统计班级的均值等信息,只需要【身高】,所以做一下小的改动:</p>
<div class="highlight">
<pre><code class="language-text">A.groupby("性别")["身高"].describe().unstack()</code></pre>
</div>
<p><img class="origin_image zh-lightbox-thumb lazy lazyload" alt="" width="1161" data-rawwidth="1161" data-rawheight="304" data-original="https://pic2.zhimg.com/v2-f8ab3400f4419385c3e81142598cd365_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-f8ab3400f4419385c3e81142598cd365_b.png" data-src="https://pic2.zhimg.com/80/v2-f8ab3400f4419385c3e81142598cd365_hd.png"></p>
<h2>unstack()</h2>
<p>索引重排</p>
<p>上面的例子里面用到了一个小的技巧,让运算结果更便于对比查看,感兴趣的同学可以自行去除unstack,比较一下显示的效果</p>
<p class="ztext-empty-paragraph">&nbsp;</p>
<h2>三、多类分组</h2>
<div class="highlight">
<pre><code class="language-text">A.groupby( ["班级","性别"])</code></pre>
</div>
<p><img class="origin_image zh-lightbox-thumb lazy lazyload" alt="" width="1197" data-rawwidth="1197" data-rawheight="541" data-original="https://pic4.zhimg.com/v2-3eb5e931b598c140372d5049f4236957_r.jpg" data-actualsrc="https://pic4.zhimg.com/v2-3eb5e931b598c140372d5049f4236957_b.png" data-src="https://pic4.zhimg.com/80/v2-3eb5e931b598c140372d5049f4236957_hd.png"></p>
<p>单独用groupby,我们得到的还是一个 Groupby 对象。</p>
<p class="ztext-empty-paragraph">&nbsp;</p>
<h2>mean()</h2>
<p>组内均值计算</p>
<p>DataFrame的很多函数可以直接运用到Groupby对象上。</p>
<p><img class="origin_image zh-lightbox-thumb lazy lazyload" alt="" width="622" data-rawwidth="622" data-rawheight="618" data-original="https://pic4.zhimg.com/v2-f2505489b936f54e9ba33be9500b8cbb_r.jpg" data-actualsrc="https://pic4.zhimg.com/v2-f2505489b936f54e9ba33be9500b8cbb_b.png" data-src="https://pic4.zhimg.com/80/v2-f2505489b936f54e9ba33be9500b8cbb_hd.png"></p>
<p>上图截自 pandas 官网 document,这里就不一一细说。</p>
<p class="ztext-empty-paragraph">&nbsp;</p>
<p>我们还可以一次运用多个函数计算</p>
<div class="highlight">
<pre><code class="language-text">A.groupby( ["班级","性别"]).agg() # 一次计算了三个</code></pre>
</div>
<p><img class="origin_image zh-lightbox-thumb lazy lazyload" alt="" width="910" data-rawwidth="910" data-rawheight="464" data-original="https://pic3.zhimg.com/v2-8d60c861be89c6f65f0288a08bc4a186_r.jpg" data-actualsrc="https://pic3.zhimg.com/v2-8d60c861be89c6f65f0288a08bc4a186_b.png" data-src="https://pic3.zhimg.com/80/v2-8d60c861be89c6f65f0288a08bc4a186_hd.png"></p>
<h2>agg()</h2>
<p><em>分组多个运算</em></p>
<h2>四、时间分组</h2>
<p>时间序列可以直接作为index,或者有一列是时间序列,差别不是很大。</p>
<p>这里仅仅演示,某一列为时间序列。</p>
<p>为A 新增一列【生日】,由于分隔符 “/” 的问题,我们查看列属性,【生日】的属性并不是日期类型</p>
<p><img class="origin_image zh-lightbox-thumb lazy lazyload" alt="" width="688" data-rawwidth="688" data-rawheight="702" data-original="https://pic2.zhimg.com/v2-7d86abe7e517a19c1036b9f0956372e1_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-7d86abe7e517a19c1036b9f0956372e1_b.png" data-src="https://pic2.zhimg.com/80/v2-7d86abe7e517a19c1036b9f0956372e1_hd.png"></p>
<p>我们想做的是:</p>
<p>1、按照【生日】的【年份】进行分组,看看有多少人是同龄?</p>
<p class="ztext-empty-paragraph">&nbsp;</p>
<div class="highlight">
<pre><code class="language-text">A["生日"] = pd.to_datetime(A["生日"],format ="%Y/%m/%d")# 转化为时间格式
A.groupby(A["生日"].apply(lambda x:x.year)).count() # 按照【生日】的【年份】分组</code></pre>
</div>
<p><img class="origin_image zh-lightbox-thumb lazy lazyload" alt="" width="1192" data-rawwidth="1192" data-rawheight="638" data-original="https://pic3.zhimg.com/v2-6dd1e0cb1d3faaf64e98c6ff5b000a66_r.jpg" data-actualsrc="https://pic3.zhimg.com/v2-6dd1e0cb1d3faaf64e98c6ff5b000a66_b.png" data-src="https://pic3.zhimg.com/80/v2-6dd1e0cb1d3faaf64e98c6ff5b000a66_hd.png"></p>
<p>进一步,我们想选拔:</p>
<p>2、同一年作为一个小组,小组内生日靠前的那一位作为小队长:</p>
<div class="highlight">
<pre><code class="language-text">A.sort_values("生日", inplace=True)# 按时间排序
A.groupby(A["生日"].apply(lambda x:x.year),as_index=False).first() </code></pre>
</div>
<p><img class="origin_image zh-lightbox-thumb lazy lazyload" alt="" width="1010" data-rawwidth="1010" data-rawheight="285" data-original="https://pic1.zhimg.com/v2-9c018011b71cf8974d230de1583b3940_r.jpg" data-actualsrc="https://pic1.zhimg.com/v2-9c018011b71cf8974d230de1583b3940_b.png" data-src="https://pic1.zhimg.com/80/v2-9c018011b71cf8974d230de1583b3940_hd.png"></p>
<h2>as_index=False</h2>
<p><em>保持原来的数据索引结果不变</em></p>
<h2>first()</h2>
<p><em>保留第一个数据</em></p>
<h2>Tail(n=1)</h2>
<p><em>保留最后n个数据</em></p>
<p class="ztext-empty-paragraph">&nbsp;</p>
<p>再进一步:</p>
<p>3、想要找到哪个月只有一个人过生日</p>
<div class="highlight">
<pre><code class="language-text">A.groupby(A["生日"].apply(lambda x:x.month),as_index=False)# 到这里是按月分组
A.groupby(A["生日"].apply(lambda x:x.month),as_index=False).filter(lambda x: len(x)==1)</code></pre>
</div>
<p><img class="origin_image zh-lightbox-thumb lazy lazyload" alt="" width="1360" data-rawwidth="1360" data-rawheight="289" data-original="https://pic3.zhimg.com/v2-b4500db4367457596864dea5fea54732_r.jpg" data-actualsrc="https://pic3.zhimg.com/v2-b4500db4367457596864dea5fea54732_b.png" data-src="https://pic3.zhimg.com/80/v2-b4500db4367457596864dea5fea54732_hd.png"></p>
<h2>filter()</h2>
<p><em>对分组进行过滤,保留满足()条件的分组</em></p>
<p><em>以上就是 groupby 最经常用到的功能了。</em></p>
<p><em>用 first(),tail()截取每组前后几个数据</em></p>
<p><em>用 apply()对每组进行(自定义)函数运算</em></p>
<p><em>用 filter()选取满足特定条件的分组</em></p>
<p><em>&nbsp;</em></p><br><br>
来源:https://www.cnblogs.com/Yanjy-OnlyOne/p/11217802.html
頁: [1]
查看完整版本: python中groupby函数详解(非常容易懂)