首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数据清洗之 分组对象与apply函数

数据清洗之 分组对象与apply函数

原创
作者头像
ruochen
修改2021-05-14 10:02:19
修改2021-05-14 10:02:19
7810
举报

分组对象与apply函数

  • 函数apply即可用于分组对象,也可以作用于dataframe数据
  • Groupby.apply(func)
  • 需要注意axis=0和axis=1的区别
    • np.sum, axis=0 相当于计算每列的总和
    • np.sum, axis=1 相当于计算每行的总和
代码语言:txt
复制
import pandas as pd
import numpy as np
import os
代码语言:txt
复制
os.getcwd()
代码语言:txt
复制
'D:\\Jupyter\\notebook\\Python数据清洗实战\\数据清洗之数据统计'
代码语言:txt
复制
os.chdir('D:\\Jupyter\\notebook\\Python数据清洗实战\\数据')
代码语言:txt
复制
df = pd.read_csv('online_order.csv', encoding='gbk', dtype={'customer':str, 'order':str})
代码语言:txt
复制
df.head(5)

<div>

<style scoped>

代码语言:txt
复制
.dataframe tbody tr th:only-of-type {
代码语言:txt
复制
    vertical-align: middle;
代码语言:txt
复制
}
代码语言:txt
复制
.dataframe tbody tr th {
代码语言:txt
复制
    vertical-align: top;
代码语言:txt
复制
}
代码语言:txt
复制
.dataframe thead th {
代码语言:txt
复制
    text-align: right;
代码语言:txt
复制
}

</style>

<table border="1" class="dataframe">

<thead>

代码语言:txt
复制
<tr style="text-align: right;">
代码语言:txt
复制
  <th></th>
代码语言:txt
复制
  <th>customer</th>
代码语言:txt
复制
  <th>order</th>
代码语言:txt
复制
  <th>total_items</th>
代码语言:txt
复制
  <th>discount%</th>
代码语言:txt
复制
  <th>weekday</th>
代码语言:txt
复制
  <th>hour</th>
代码语言:txt
复制
  <th>Food%</th>
代码语言:txt
复制
  <th>Fresh%</th>
代码语言:txt
复制
  <th>Drinks%</th>
代码语言:txt
复制
  <th>Home%</th>
代码语言:txt
复制
  <th>Beauty%</th>
代码语言:txt
复制
  <th>Health%</th>
代码语言:txt
复制
  <th>Baby%</th>
代码语言:txt
复制
  <th>Pets%</th>
代码语言:txt
复制
</tr>

</thead>

<tbody>

代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>0</th>
代码语言:txt
复制
  <td>0</td>
代码语言:txt
复制
  <td>0</td>
代码语言:txt
复制
  <td>45</td>
代码语言:txt
复制
  <td>23.03</td>
代码语言:txt
复制
  <td>4</td>
代码语言:txt
复制
  <td>13</td>
代码语言:txt
复制
  <td>9.46</td>
代码语言:txt
复制
  <td>87.06</td>
代码语言:txt
复制
  <td>3.48</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>1</th>
代码语言:txt
复制
  <td>0</td>
代码语言:txt
复制
  <td>1</td>
代码语言:txt
复制
  <td>38</td>
代码语言:txt
复制
  <td>1.22</td>
代码语言:txt
复制
  <td>5</td>
代码语言:txt
复制
  <td>13</td>
代码语言:txt
复制
  <td>15.87</td>
代码语言:txt
复制
  <td>75.80</td>
代码语言:txt
复制
  <td>6.22</td>
代码语言:txt
复制
  <td>2.12</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>2</th>
代码语言:txt
复制
  <td>0</td>
代码语言:txt
复制
  <td>2</td>
代码语言:txt
复制
  <td>51</td>
代码语言:txt
复制
  <td>18.08</td>
代码语言:txt
复制
  <td>4</td>
代码语言:txt
复制
  <td>13</td>
代码语言:txt
复制
  <td>16.88</td>
代码语言:txt
复制
  <td>56.75</td>
代码语言:txt
复制
  <td>3.37</td>
代码语言:txt
复制
  <td>16.48</td>
代码语言:txt
复制
  <td>6.53</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>3</th>
代码语言:txt
复制
  <td>1</td>
代码语言:txt
复制
  <td>3</td>
代码语言:txt
复制
  <td>57</td>
代码语言:txt
复制
  <td>16.51</td>
代码语言:txt
复制
  <td>1</td>
代码语言:txt
复制
  <td>12</td>
代码语言:txt
复制
  <td>28.81</td>
代码语言:txt
复制
  <td>35.99</td>
代码语言:txt
复制
  <td>11.78</td>
代码语言:txt
复制
  <td>4.62</td>
代码语言:txt
复制
  <td>2.87</td>
代码语言:txt
复制
  <td>15.92</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>4</th>
代码语言:txt
复制
  <td>1</td>
代码语言:txt
复制
  <td>4</td>
代码语言:txt
复制
  <td>53</td>
代码语言:txt
复制
  <td>18.31</td>
代码语言:txt
复制
  <td>2</td>
代码语言:txt
复制
  <td>11</td>
代码语言:txt
复制
  <td>24.13</td>
代码语言:txt
复制
  <td>60.38</td>
代码语言:txt
复制
  <td>7.78</td>
代码语言:txt
复制
  <td>7.72</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
</tr>

</tbody>

</table>

</div>

代码语言:txt
复制
grouped = df.groupby('weekday')
代码语言:txt
复制
# 只可传入一个统计参数
# agg可传入多个
# grouped.apply([np.mean, np.sum])
代码语言:txt
复制
grouped.apply(np.mean)[['total_items', 'discount%', 'weekday']]

<div>

<style scoped>

代码语言:txt
复制
.dataframe tbody tr th:only-of-type {
代码语言:txt
复制
    vertical-align: middle;
代码语言:txt
复制
}
代码语言:txt
复制
.dataframe tbody tr th {
代码语言:txt
复制
    vertical-align: top;
代码语言:txt
复制
}
代码语言:txt
复制
.dataframe thead th {
代码语言:txt
复制
    text-align: right;
代码语言:txt
复制
}

</style>

<table border="1" class="dataframe">

<thead>

代码语言:txt
复制
<tr style="text-align: right;">
代码语言:txt
复制
  <th></th>
代码语言:txt
复制
  <th>total_items</th>
代码语言:txt
复制
  <th>discount%</th>
代码语言:txt
复制
  <th>weekday</th>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>weekday</th>
代码语言:txt
复制
  <th></th>
代码语言:txt
复制
  <th></th>
代码语言:txt
复制
  <th></th>
代码语言:txt
复制
</tr>

</thead>

<tbody>

代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>1</th>
代码语言:txt
复制
  <td>30.662177</td>
代码语言:txt
复制
  <td>8.580705</td>
代码语言:txt
复制
  <td>1.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>2</th>
代码语言:txt
复制
  <td>31.868612</td>
代码语言:txt
复制
  <td>8.638014</td>
代码语言:txt
复制
  <td>2.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>3</th>
代码语言:txt
复制
  <td>31.869796</td>
代码语言:txt
复制
  <td>7.794507</td>
代码语言:txt
复制
  <td>3.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>4</th>
代码语言:txt
复制
  <td>32.251899</td>
代码语言:txt
复制
  <td>8.068155</td>
代码语言:txt
复制
  <td>4.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>5</th>
代码语言:txt
复制
  <td>31.406619</td>
代码语言:txt
复制
  <td>9.159031</td>
代码语言:txt
复制
  <td>5.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>6</th>
代码语言:txt
复制
  <td>32.154814</td>
代码语言:txt
复制
  <td>8.414258</td>
代码语言:txt
复制
  <td>6.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>7</th>
代码语言:txt
复制
  <td>32.373837</td>
代码语言:txt
复制
  <td>8.710171</td>
代码语言:txt
复制
  <td>7.0</td>
代码语言:txt
复制
</tr>

</tbody>

</table>

</div>

代码语言:txt
复制
df.columns
代码语言:txt
复制
Index(['customer', 'order', 'total_items', 'discount%', 'weekday', 'hour',
代码语言:txt
复制
       'Food%', 'Fresh%', 'Drinks%', 'Home%', 'Beauty%', 'Health%', 'Baby%',
代码语言:txt
复制
       'Pets%'],
代码语言:txt
复制
      dtype='object')
代码语言:txt
复制
var = ['Food%', 'Fresh%', 'Drinks%', 'Home%', 'Beauty%', 'Health%', 'Baby%',
       'Pets%']
代码语言:txt
复制
df[var].head(5)

<div>

<style scoped>

代码语言:txt
复制
.dataframe tbody tr th:only-of-type {
代码语言:txt
复制
    vertical-align: middle;
代码语言:txt
复制
}
代码语言:txt
复制
.dataframe tbody tr th {
代码语言:txt
复制
    vertical-align: top;
代码语言:txt
复制
}
代码语言:txt
复制
.dataframe thead th {
代码语言:txt
复制
    text-align: right;
代码语言:txt
复制
}

</style>

<table border="1" class="dataframe">

<thead>

代码语言:txt
复制
<tr style="text-align: right;">
代码语言:txt
复制
  <th></th>
代码语言:txt
复制
  <th>Food%</th>
代码语言:txt
复制
  <th>Fresh%</th>
代码语言:txt
复制
  <th>Drinks%</th>
代码语言:txt
复制
  <th>Home%</th>
代码语言:txt
复制
  <th>Beauty%</th>
代码语言:txt
复制
  <th>Health%</th>
代码语言:txt
复制
  <th>Baby%</th>
代码语言:txt
复制
  <th>Pets%</th>
代码语言:txt
复制
</tr>

</thead>

<tbody>

代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>0</th>
代码语言:txt
复制
  <td>9.46</td>
代码语言:txt
复制
  <td>87.06</td>
代码语言:txt
复制
  <td>3.48</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>1</th>
代码语言:txt
复制
  <td>15.87</td>
代码语言:txt
复制
  <td>75.80</td>
代码语言:txt
复制
  <td>6.22</td>
代码语言:txt
复制
  <td>2.12</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>2</th>
代码语言:txt
复制
  <td>16.88</td>
代码语言:txt
复制
  <td>56.75</td>
代码语言:txt
复制
  <td>3.37</td>
代码语言:txt
复制
  <td>16.48</td>
代码语言:txt
复制
  <td>6.53</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>3</th>
代码语言:txt
复制
  <td>28.81</td>
代码语言:txt
复制
  <td>35.99</td>
代码语言:txt
复制
  <td>11.78</td>
代码语言:txt
复制
  <td>4.62</td>
代码语言:txt
复制
  <td>2.87</td>
代码语言:txt
复制
  <td>15.92</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
</tr>
代码语言:txt
复制
<tr>
代码语言:txt
复制
  <th>4</th>
代码语言:txt
复制
  <td>24.13</td>
代码语言:txt
复制
  <td>60.38</td>
代码语言:txt
复制
  <td>7.78</td>
代码语言:txt
复制
  <td>7.72</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.00</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
  <td>0.0</td>
代码语言:txt
复制
</tr>

</tbody>

</table>

</div>

代码语言:txt
复制
# 计算每个变量的总和
df[var].apply(np.sum, axis=0)
代码语言:txt
复制
Food%      706812.19
代码语言:txt
复制
Fresh%     606818.38
代码语言:txt
复制
Drinks%    700477.06
代码语言:txt
复制
Home%      406187.25
代码语言:txt
复制
Beauty%    176788.48
代码语言:txt
复制
Health%     33988.76
代码语言:txt
复制
Baby%      332884.34
代码语言:txt
复制
Pets%       31292.61
代码语言:txt
复制
dtype: float64
代码语言:txt
复制
# 对每一行求和
df[var].apply(np.sum, axis=1).head(5)
代码语言:txt
复制
0    100.00
代码语言:txt
复制
1    100.01
代码语言:txt
复制
2    100.01
代码语言:txt
复制
3     99.99
代码语言:txt
复制
4    100.01
代码语言:txt
复制
dtype: float64
代码语言:txt
复制
# Food% - Fresh%
df[var].apply(lambda x: x[0] - x[1], axis=1).head(5)
代码语言:txt
复制
0   -77.60
代码语言:txt
复制
1   -59.93
代码语言:txt
复制
2   -39.87
代码语言:txt
复制
3    -7.18
代码语言:txt
复制
4   -36.25
代码语言:txt
复制
dtype: float64

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分组对象与apply函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档