Chapter 1:创建与探索DF、排序、子集化:Python数据分析——Pandas基础入门+代码(一)
Chapter 2:聚合函数,groupby,统计分析:Python数据分析——Pandas基础入门+代码(二)
Chapter 3:索引和切片:Python数据分析——Pandas基础入门+代码(三)
Chapter 4: 可视化与读写csv文件:Python数据分析——Pandas基础入门+代码(四)
Chapter 5:数据透视表:Python数据分析——Pandas基础入门+代码之数据透视表
这一篇主要讲的是:
聚合Agg、分组groupby以及“统计”
涉及到如下的methods:
这边列出来的是一些我们常用的描述性统计上的东西,其实可以直接describe(),就能直接知道每列的一个信息。至于怎么去用应该特别简单,举个例子。
Name | Description |
---|---|
均值 | mean() / np.mean() |
中位数 | np.median() |
最大值 | max() |
最小值 | min() |
累加 | .cumsum() |
累计最大 | .cummax() |
For example, 某个DataFrame前几行是这样的。
假如去计算每周的销售额weekly_sales的均值和中位数,代码如下
In [1]: print(sales['weekly_sales'].mean())
Out [1]: 23843.95014850566
In [2]: print(sales['weekly_sales'].median())
Out [2]: 12049.064999999999
.agg() 可以使得我们进行一个高效的聚合运算,我们可以自定函数放到里面,也可以使用其他包中的函数
代码示例如下,这是我们自定义的函数
# A custom IQR function
def iqr(column):
return column.quantile(0.75) - column.quantile(0.25)
然后,我们可以将其放入到agg()中进行运算,就能得到如下的结果
# Print IQR of the temperature_c column
In [1]: print(sales['temperature_c'].agg(iqr))
Out [1]: 16.583333333333336
接下来是2个值得注意的地方。
# 下面这两很重要
# 多列同时聚合
print(sales[["temperature_c", "fuel_price_usd_per_l", "unemployment"]].agg(iqr))
# 多个function同时使用!
print(sales[["temperature_c", "fuel_price_usd_per_l", "unemployment"]].agg([iqr, np.median]))
counting计数之前可以对数据进行一个去重处理,把重复的东西删掉。使用 drop_duplicates(),对列进行处理。
## 函数的主体
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)
'''
官方解释:
subset: 输入我们需要去重的列标签或便签序列,多变量需要用中括号括起来
keep: 默认是‘first’。还有 ‘last’, False,确定要保留哪些重复项(如果有)。
- first :删除除第一次出现的重复项。
- last :删除除最后一次出现的重复项。
- False :删除所有重复项。
inplace: 布尔值,默认为 False。是否将重复项放在适当的位置或返回副本。
ignore_index: 默认为Fasle,如果为True则会有重新生成序列号,从0开始,直到n-1
'''
# one column
dt = df.drop_duplicates('column1')
dt = df.drop_duplicates(subset = 'column1')
# multiply column
df = df.drop_duplicates(['column1', 'column2'])
df = df.drop_duplicates(subset=["column1", "column2"])
举个例子,我们原本的数据是这样的
我们对store和type进行了一个去重
图中只是对多变量进行了去重处理,跟上面一样,处理完可以开始多变量的计数。
这里的话有两种count:
对比情况可以看看下面的代码, 第一种例子如下
# Methods 1
store_counts = store_types['type'].count()
# Result 1
In [1]: store_types['type'].count()
Out[1]: 12
# Methods 2
store_types['type'].value_counts()
# Result 2
In [10]: store_types['type'].value_counts()
A 11
B 1
Name: type, dtype: int64
可以很明显的看出二者的差别。count() 就是计数全部,而 value_counts() 可以分别对每个value进行计数。value_counts() 主体如下:
DataFrame.value_counts(subset=None, normalize=False, sort=True, ascending=False, dropna=True)
'''
Description:
subset: 指定一列给它去计数
normalize: 默认为False,如果为True的话,它不会返回计算的数值,而是返回一个比例
sort:默认为True,按频率排序
ascending:默认为False,True的话就会降序
dropna:默认为True,不要包括包含 NA 值的行数。
'''
那既然都能算出每个分类的数量了,那么如何计算每个分类的比例呢?可以看到上面的主体里面将 normalize = True 即可,结果就会以百分比形式进行输出
In [1]: store_types["type"].value_counts(normalize=True)
Out [1]:
A 0.917
B 0.083
Name: type, dtype: float64
图片中,希望我们一开始先手动实现一个 分组统计,再利用groupby计算,做一个对比,可以观察二者的差别。
'''
分组统计。
这里就是将不同的type分别先提取出来,再分别找到各自的weekly_sales的列进行求和计算
'''
# Calc total weekly sales
sales_all = sales["weekly_sales"].sum()
# Subset for type A stores, calc total weekly sales
sales_A = sales[sales["type"] == "A"]["weekly_sales"].sum()
# Subset for type B stores, calc total weekly sales
sales_B = sales[sales["type"] == "B"]["weekly_sales"].sum()
# Subset for type C stores, calc total weekly sales
sales_C = sales[sales["type"] == "C"]["weekly_sales"].sum()
# Get proportion for each type
sales_propn_by_type = [sales_A, sales_B, sales_C] / sales_all
print(sales_propn_by_type)
## Result
Out[1]: [0.9097747 0.0902253 0. ]
下面这里是groupby用法
'''
这里就是groupby的用法
'''
# Group by type; calc total weekly sales
sales_by_type = sales.groupby("type")["weekly_sales"].sum()
# Get proportion for each type
sales_propn_by_type = sales_by_type / sum(sales_by_type)
print(sales_propn_by_type)
## Result 2
Out[2]:
type
A 0.91
B 0.09
Name: weekly_sales, dtype: float6
很明显的差别就是 .groupby() 不用一个个输入tpye是什么类型,它自动按照type进行分组计算,也就是说,它会按照你指定的column里的内容,自动的分组计算。
下面是多变量groupby以及用上了methods,这里依然需要注意的是,agg()里面多个methods需要中括号;
# Import numpy with the alias np
import numpy as np
# For each store type, aggregate weekly_sales: get min, max, mean, and median
sales_stats = sales.groupby('type')['weekly_sales'].agg([min, max, np.mean, np.median])
# Print sales_stats
print(sales_stats)
# For each store type, aggregate unemployment and fuel_price_usd_per_l: get min, max, mean, and median
unemp_fuel_stats = sales.groupby('type')[['unemployment', 'fuel_price_usd_per_l']].agg([min, max, np.mean, np.median])
# Print unemp_fuel_stats
print(unemp_fuel_stats)
还有groupby对多变量也要再加一个中括号,无论是.groupby()的小括号里面,还是groupby()后面的[]这个里面,你只要涉及到多变量,那么就要在里面再加一个[]
举个例子
# 第一个加中括号 [[''unemployment', 'fuel_price_usd_per_l'']]
unemp_fuel_stats = sales.groupby('type')[['unemployment', 'fuel_price_usd_per_l']].sum()
# 第二个中括号位置.groupby(['type', 'xxx'])
unemp_fuel_stats = sales.groupby(['type', 'column2'])[['unemployment', 'fuel_price_usd_per_l']].sum()
这一章主要就讲了几点小内容:
我一直会强调注意括号问题,因为我总是会在语法格式上面出错,所以得一直牢牢记住,算是给自己提醒。
Source:Datacamp 链接地址:https://app.datacamp.com/
朋友们可以自行上面学习哈!