pandas的简单使用(数据统计)
- 统计
-
- 汇总类统计(针对数值型)
- 描述性统计(针对数值型)
- 相关系数和协方差(针对数值型)
- 不挑类型的统计
- 统计相关的筛选
-
- idxmin() dxmax()
- nsmallest() nlargest()
- groupby分组统计
-
- 单个列groupby,查询所有数据列的统计
- 多个列groupby,查询所有数据列的统计
- 同时查看多种数据统计
- 查看单列的结果数据统计
- 不同列使用不同的聚合函数
- 遍历groupby的结果理解执行流程
-
- 遍历单个列聚合的分组
- 遍历多个列聚合的分组
- groupby实战样例
统计 如果DataFrame里全是数值,那么汇总类的统计,就可以不加列名。
比如求和
- df.sum(axis=1) 是求每一行的和。等价于 df.apply(np.sum,axis=1)
- df.sum(axis=0) 是求每一列的和。等价于 df.apply(np.sum,axis=0)
汇总类统计(针对数值型)
# 统计每一列的个数
df.count()# 统计非空值的个数(一般搭配列使用)
# 下面三行结果一样
df['weight'].value_counts()
df.value_counts('weight')
df.groupby('weight').size()# 下面三行结果一样(但效果上groupby更好)
df[['age','weight']].value_counts()
df.value_counts(['age','weight'])
df.groupby(['age','weight']).size()# 下面这些统计方法,一般搭配列使用,若不加大都会有警告
# 不加列df.sum(), 多个列df[['列1','列2']].sum()# 计算累加
df['weigh'].sum()# 统计均值
df['weigh'].mean()# 统计中位数
df['weigh'].median()# 统计最大值
df['weigh'].max()# 统计最小值
df['weigh'].min()# 统计方差
df['weigh'].var()# 统计标椎差
df['weigh'].std()# 对特定几列的数据进行统计分析
df.agg(
{
"Age": ["min", "max", "mean"],
"weigh": ["min", "max", "mean"]
}
)
>>> 输出
Ageweigh
min1232.00
max80212.32
mean 29.6952.20
描述性统计(针对数值型) 【#|pandas的简单使用(数据统计)】描述性统计只针对列数据是int型的。它能看出这一列中数据的分布情况
# 统计个数,计算均值,标椎差,最小值,一二三分位数,最大值(countmeanstdmin25%50%75%max)
a = data.describe()# 加参数形式(参数过多,加个转置方便看)
aa = data.describe([0.01,0.1,0.25,0.5,0.75,0.9,0.99]).T
输出aa,,,
'''
# 描述性统计
# 列表里的数值与分位数有关,但不是分位数
# 分位数(Quantile),亦称分位点,是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数(即二分位数)、四分位数、百分位数等。
# 四分位数(Quartile)也称四分位点,是指在统计学中把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值。打印结果:countmeanstdmin1%10%25%50%75%90%99%max
SeriousDlqin2yrs149391.00.0669990.2500210.00.00.0000000.0000000.0000000.0000000.0000001.0000001.0
RevolvingUtilizationOfUnsecuredLines149391.06.071087250.2636720.00.00.0031990.0301320.1542350.5564940.9780071.09392250708.0
age149391.052.30623714.7259620.024.033.00000041.00000052.00000063.00000072.00000087.000000109.0
NumberOfTime30-59DaysPastDueNotWorse149391.00.3938863.8529530.00.00.0000000.0000000.0000000.0000001.0000004.00000098.0
DebtRatio149391.0354.4367402041.8434550.00.00.0349910.1774410.3682340.8752791275.0000004985.100000329664.0
MonthlyIncome149391.05426.88692613245.6239320.00.00.1800001800.0000004425.0000007416.00000010800.00000023205.0000003008750.0
NumberOfOpenCreditLinesAndLoans149391.08.4808925.1365150.00.03.0000005.0000008.00000011.00000015.00000024.00000058.0
NumberOfTimes90DaysLate149391.00.2381203.8261650.00.00.0000000.0000000.0000000.0000000.0000003.00000098.0
NumberRealEstateLoansOrLines149391.01.0223911.1301960.00.00.0000000.0000001.0000002.0000002.0000004.00000054.0
NumberOfTime60-89DaysPastDueNotWorse149391.00.2125033.8105230.00.00.0000000.0000000.0000000.0000000.0000002.00000098.0
NumberOfDependents149391.00.7598631.1017490.00.00.0000000.0000000.0000001.0000002.0000004.00000020.0月收入(MonthlyIncome)这一行,最小值是0,最大值是3008750。收入在0.18以下的人有10%,在1800以下的人有25%,中位数是4425,月收入超过23205的只有1%
过去两年内出现35-59天逾期但是没有发展得更坏的次数(NumberOfTime30-59DaysPastDueNotWorse),说明有75%的数都是0。实际上0有125453个,而数据才有149391行
'''
相关系数和协方差(针对数值型)
# 协方差矩阵(输出列之间 两两对应的协方差)
df.cov()# 相关系数矩阵(输出列之间 两两对应的相关系数)
df.corr()# 单独查看两个列之间
df['气候'].cov(df['最高温'])
df['气候'].corr(df['最高温'])# 添加点运算的
df['气候'].cov(df['最高温']-df['最低温'])
df['气候'].corr(df['最高温']-df['最低温'])
不挑类型的统计
# 统计每一列的个数
df.count()# 统计值的个数(一般搭配列使用)
# 不加列df.value_counts(), 多个列df[['列1','列2']].value_counts()
df['班级'].value_counts()# 找出这一列中的唯一值,类型是类似于 set(df['班级'])
df['班级'].unique()
统计相关的筛选
df = pd.DataFrame({
"A": [4, 23, 22, 54, 16],
"B": [1, 12, 65, 11, 27],
"C": [22, 11, 18, 12, 25]
})
idxmin() dxmax()
idxmin()和idxmax()方法,用来查找表格当中最大/最小值的位置,返回的是值的索引
用在DataFrame
print(df.idxmax())
'''
A3
B2
C4
dtype: int64
'''
# axis值默认为0。当值为1时,统计结果如下
print(df.idxmax(axis=1))
'''
0C
1A
2B
3A
4B
dtype: object
'''
用在Series
print(df['A'].idxmin())# 0
print(df['A'].idxmax())# 3
nsmallest() nlargest()
nsmallest 以及 nlargest 方法是用来找到数据集当中最小、最大的若干数据。(相当于排序后在截取)
print(df.nsmallest(2, "A"))
'''
ABC
04122
4162725
'''
print(df.nlargest(2, "A"))
'''
ABC
3541112
1231211
'''
groupby分组统计
对于要用到groupby的情况,我更习惯于写SQL
from pandasql import sqldf
print(sqldf(‘select * from df’, globals()))
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
文章图片
单个列groupby,查询所有数据列的统计
print(df.groupby('A').sum())
'''
CD
A
bar3.598579 -2.481592
foo2.001150 -0.068664
'''
多个列groupby,查询所有数据列的统计
print(df.groupby(['A','B']).mean())
'''
CD
AB
barone1.361650 -0.115852
three -0.0616490.602065
two2.298578 -2.967804
fooone0.070933 -0.293511
three0.814926 -0.078753
two0.5221790.298556
'''
添加参数:as_index=False
print(df.groupby(['A','B'], as_index=False).mean())
'''
A B C D
0 bar one1.361650 -0.115852
1 bar three-0.0616490.602065
2 bar two2.298578 -2.967804
3 foo one0.070933 -0.293511
4 foo three 0.814926 -0.078753
5 foo two0.5221790.298556
'''
同时查看多种数据统计
print(df.groupby('A').agg([np.sum, np.mean, np.std, np.max]))
'''
CD
summeanstdsummeanstd
A
bar 3.598579 1.199526 1.188437 -2.481592 -0.827197 1.888253
foo 2.001150 0.400230 0.905741 -0.068664 -0.013733 0.417000
'''
查看单列的结果数据统计
# 方法一
print(df.groupby('A')['C'].agg([np.sum, np.mean, np.std, np.max]))# 方法二
print(df.groupby('A').agg([np.sum, np.mean, np.std, np.max])['C'])'''
summeanstd
A
bar 3.598579 1.199526 1.188437
foo 2.001150 0.400230 0.905741
'''
不同列使用不同的聚合函数
print(df.groupby('A').agg({"C":np.sum, "D":np.mean}))
'''
CD
A
bar 3.598579 -0.827197
foo 2.001150 -0.013733
'''
遍历groupby的结果理解执行流程 遍历单个列聚合的分组
g = df.groupby('A')
print(g)
''''''
遍历g这个对象,发现它依据A列的值,将原数据分成了两组
for name,group in g:
print(name)
print(group)
print('-'*50)
'''
bar
ABCD
1barone1.361650 -0.115852
3barthree -0.0616490.602065
5bartwo2.298578 -2.967804
--------------------------------------------------
foo
ABCD
0fooone -1.097846 -0.208192
2footwo0.266452 -0.104663
4footwo0.7779060.701774
6fooone1.239711 -0.378830
7foothree0.814926 -0.078753
--------------------------------------------------
'''
可以获取单个分组的数据
g.get_group('bar')
'''
A B C D
1 bar one1.361650 -0.115852
3 bar three-0.0616490.602065
5 bar two2.298578 -2.967804
'''
遍历多个列聚合的分组
g = df.groupby(['A', 'B'])
for name,group in g:
print(name)
print(group)
print('-'*50)# 可以看到,name是一个2个元素的tuple,代表不同的列
'''
('bar', 'one')
ABCD
1barone1.36165 -0.115852
--------------------------------------------------
('bar', 'three')
ABCD
3barthree -0.0616490.602065
--------------------------------------------------
('bar', 'two')
ABCD
5bartwo2.298578 -2.967804
--------------------------------------------------
('foo', 'one')
ABCD
0fooone -1.097846 -0.208192
6fooone1.239711 -0.378830
--------------------------------------------------
('foo', 'three')
ABCD
7foothree0.814926 -0.078753
--------------------------------------------------
('foo', 'two')
ABCD
2footwo0.266452 -0.104663
4footwo0.7779060.701774
--------------------------------------------------
'''
g.get_group(('foo', 'one'))
'''
A B C D
0 foo one -1.097846 -0.208192
6 foo one 1.239711 -0.378830
'''
g = df.groupby(['A', 'B'])
print(g['C'])
for name, group in g['C']:
print(name)
print(group)
print(type(group))
print('-'*50)
groupby的大体执行流程是
首先按照key进行分组,就可以得到每个group的名称以及group本身
而那些统计函数,都是在group上进行的
待计算完成之后,pandas会将key和统计结果拼接起来,得到一个结果的DataFrame
groupby实战样例 补充个知识点:Pandas的GroupBy遵从split、apply、combine模式。(DataFrame.groupby(‘Col1’).sum())
文章图片
进入正题
import pandas as pd
import numpy as np# df 一共有存放有366条数据,详细记录了2020年每一天的天气情况
df = pd.read_csv('F:\\Temp\\datas\\Tianqi_2020.csv')# 添加一个月份列。时间是2020-10-10形式的
df['月份'] = df['时间'].str[:7]# 查看每个月的最高温(1个月有30天,所以要在30个值中找出最大的) data1与data2相同
data1 = df.groupby('月份')['最高温'].max()
data2 = df.groupby('月份').max()['最高温']# 查看每个月的最高温度、最低温度、平均空气质量指数
group_data = https://www.it610.com/article/df.groupby('月份').agg({"最高温":np.max, "最低温":np.min, "空气指数":np.mean})# 查看每个月温度最高的2天数据
def getWenduTopN(df, topn):
# 这里的df,是每个月份分组group的df
return df.sort_values(by="bWendu", ascending=False)[["月份", "最高温"]][:topn]
data = https://www.it610.com/article/df.groupby("month").apply(getWenduTopN, topn=2)# 画图
import matplotlib.pyplot as plt
plt.plot(data1)
plt.plot(group_data )
plt.show()
推荐阅读
- Python|【Python】使用一行代码实现均值,中位数和众数
- 深度学习|Jupyter Notebook(Anaconda)——两个环境分别修改默认打开目录(深度学习第一周番外篇)
- #|深度学习之 11 空洞卷积的实现
- 神经网络与深度学习|【神经网络与深度学习】CIFAR10数据集介绍,并使用卷积神经网络训练图像分类模型——[附完整训练代码]
- 人工智能|21个项目玩转深度学习(基于TensorFlow的实践详解02—CIFAR10图像识别)
- python|CIFAR-10 图像识别
- tensorflow2.0|Tensorflow 2 实战(kears)- CIFAR10自定义网络、模型加载与保存实战
- Python之循环语句while
- mysql|数据库系统设计大作业(图书馆管理系统)