Python数据分析——Pandas基础入门+代码(二)

系列文章目录

Chapter 1:创建与探索DF、排序、子集化:Python数据分析——Pandas基础入门+代码(一)
Chapter 2:聚合函数,groupby,统计分析:Python数据分析——Pandas基础入门+代码(二)
Chapter 3:索引和切片:Python数据分析——Pandas基础入门+代码(三)
Chapter 4: 可视化与读写csv文件:Python数据分析——Pandas基础入门+代码(四)
Chapter 5:数据透视表:Python数据分析——Pandas基础入门+代码之数据透视表


文章目录

  • 系列文章目录
  • 前言
  • 一、如何利用pandas解决统计上的某些问题
  • 二、如何使用pandas.DataFrame.agg() 聚合方法
  • 三、如何使用pandas进行counting计数?
    • 3.1 .drop_duplicates() 去重
    • 3.2 多分类变量的计数
  • 四、 .groupby() 的使用
  • 总结
  • Reference:


前言

这一篇主要讲的是:

聚合Agg、分组groupby以及“统计”

涉及到如下的methods:

  • .agg()
  • .drop_duplicates()
  • .value_counts()
  • .groupby()

一、如何利用pandas解决统计上的某些问题

这边列出来的是一些我们常用的描述性统计上的东西,其实可以直接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

二、如何使用pandas.DataFrame.agg() 聚合方法

.agg() 可以使得我们进行一个高效的聚合运算,我们可以自定函数放到里面,也可以使用其他包中的函数
Python数据分析——Pandas基础入门+代码(二)_第1张图片

代码示例如下,这是我们自定义的函数

# 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个值得注意的地方。

  • 首先,如果我们需要对多列进行聚合,那么我们就像之前那篇说过的一样,需要在里面多打上一个中括号。
  • 其次,如果我们需要利用多个function进行运算,同样也需要多打上一个中括号。如下所示
# 下面这两很重要
# 多列同时聚合
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]))

三、如何使用pandas进行counting计数?

3.1 .drop_duplicates() 去重

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"])

Python数据分析——Pandas基础入门+代码(二)_第2张图片
举个例子,我们原本的数据是这样的
Python数据分析——Pandas基础入门+代码(二)_第3张图片
我们对store和type进行了一个去重
Python数据分析——Pandas基础入门+代码(二)_第4张图片

3.2 多分类变量的计数

图中只是对多变量进行了去重处理,跟上面一样,处理完可以开始多变量的计数。
Python数据分析——Pandas基础入门+代码(二)_第5张图片

这里的话有两种count:

  • 第一种,计算总数的method:.count()
  • 第二种,可以分类的count,会将不同类别都count出来,也就是 value_counts()

对比情况可以看看下面的代码, 第一种例子如下

# 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() 的使用

Python数据分析——Pandas基础入门+代码(二)_第6张图片
图片中,希望我们一开始先手动实现一个 分组统计,再利用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()

总结

这一章主要就讲了几点小内容:

  • 聚合函数
  • groupby方法
  • 分组统计上的小方法

我一直会强调注意括号问题,因为我总是会在语法格式上面出错,所以得一直牢牢记住,算是给自己提醒。


Reference:

Source:Datacamp 链接地址:https://app.datacamp.com/
朋友们可以自行上面学习哈!

你可能感兴趣的:(数据科学,机器学习,python,数据分析)