跟我一起学点 数据分析 -- 第四天:上手pandas(4)

举报
看,未来 发表于 2020/12/31 01:12:48 2020/12/31
【摘要】 文章目录 前文回顾大数据排序sort_index方法sort_values方法 数据计算agg 数据分析常用计算方法describe方法value_counts方法 分组与聚合计算分组合并两列数据 前文回顾 跟我一起学点 数据分析 – 第三天:上手pandas(3) 大数据排序 sort_index方法 这个函数呢,你看到它的参数有很...

在这里插入图片描述

前文回顾

跟我一起学点 数据分析 – 第三天:上手pandas(3)

大数据排序

sort_index方法

这个函数呢,你看到它的参数有很多,但是常用参数只有一个:ascending:True升序,False降序。

dict1 = {"name": ["小红", "小明", "小张"], "age": [16, 18, 17], "city": ["北京  ", "杭州", "  上海  "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])

# 清除空格
df2["city"] = df2["city"].map(str.strip)

df2 = df2.set_index('age')

df2 = df2.sort_index(ascending=True)

print(df2)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这个是正常可以用的啊,根据索引列进行升序排序。

 name city
age 16 小红   北京
17 小张   上海
18 小明   杭州

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

如果我们的索引列中有重复值,会怎么样?试试看呗:

dict1 = {"name": ["小明", "小张","小红"], "age": [17, 18, 17], "city": ["北京  ", "杭州", "  上海  "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])

# 清除空格
df2["city"] = df2["city"].map(str.strip)

df2 = df2.set_index('age')

df2 = df2.sort_index(ascending=True)

print(df2)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

看一下结果啊:

 name city
age 17 小明   北京
17 小红   上海
18 小张   杭州

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

可以看出来,当索引列有重复值的时候,就按照在原数据中的顺序进行排放。

那,如果索引列不是阿拉伯数字,而是字符串呢?
啊,不知道各位有没有听说过ASCII码啊,应该都听过吧。

dict1 = {"name": ["ming","hong","zhang"], "age": [17, 18, 17], "city": ["北京  ", "杭州", "  上海  "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])

# 清除空格
df2["city"] = df2["city"].map(str.strip)

df2 = df2.set_index('name')

df2 = df2.sort_index(ascending=True)

print(df2)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
 age city
name hong 18   杭州
ming 17   北京
zhang   17   上海

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

你要问为什么把中文名改成英文名啊,那我哪知道中文是怎么排序的。。。

别问,问就是不知道。


sort_values方法

这个函数就比较,高可拓展。
常用参数我们看看:

by:strlist,按照列名排序
ascending:都懂、
inplace:替换DataFrame的数据
kind:排序算法,快排、归并、堆排,缺省是快排。{'quicksort','mergesort','heapsort'}

  
 
  • 1
  • 2
  • 3
  • 4

按照年龄进行逆向排序

# 创建含有空格的数据
dict1 = {"name": ["ming","hong","zhang"], "age": [17, 18, 17], "city": ["北京  ", "杭州", "  上海  "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])

# 清除空格
df2["city"] = df2["city"].map(str.strip)

df2.sort_values('age',ascending=False,inplace = True)

print(df2)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
 age city
name hong 18   杭州
ming 17   北京
zhang   17   上海

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

按照年龄和名字进行逆向排序呢?以年龄为主导,姓名为辅助:

df2.sort_values(['age','name'],ascending=False,,inplace = True)

  
 
  • 1
 age city
name hong 18   杭州
zhang   17   上海
ming 17   北京

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

数据计算

加减乘除啥的我就不讲了吧,数值计算函数有:min、max、idxmin(最小值的索引)、inxmax、mean、sum、count
这些也不提了吧。

那我们来看些别的吧。

agg

agg函数,既可以作用于DataFrame,也可以作用于Series对象。
常用参数有:func:函数名称,或者函数名称列表。

演示一下?
演示一下:

# 创建含有空格的数据
dict1 = {"name": ["ming","hong","zhang"], "age": [17, 18, 17], "city": ["北京  ", "杭州", "  上海  "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])

# 清除空格
df2["city"] = df2["city"].map(str.strip)

print(df2.age.agg(['max','min','mean','sum']))	# 一个一个没意思,直接一批吧

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
max 18.000000
min 17.000000
mean 17.333333
sum 52.000000
Name: age, dtype: float64

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

数据分析常用计算方法

describe方法

查看数值列的 计数、平均值、标准差、最小值、25/75百分位数、中位数、最大值

常用参数:include、exclude

数据还是上面的数据,然后我们来执行以下:

print(df2.describe().T)	#这里的T是干嘛的,矩阵转置啊。

  
 
  • 1
 count mean std   min   25%   50%   75%   max
age 3.0  17.333333  0.57735  17.0  17.0  17.0  17.5  18.0

  
 
  • 1
  • 2

为什么要转置啊,因为上面这边数据量小啊,所以看着就不明显。

如果你这样指定了列:

print((df2.age).describe().T)

  
 
  • 1

那你不用转了,转不转都没效果:

count 3.000000
mean 17.333333
std 0.577350
min 17.000000
25% 17.000000
50% 17.000000
75% 17.500000
max 18.000000
Name: age, dtype: float64

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

换个字符串列来试试看:

print((df2.name).describe().T)

  
 
  • 1

这数据是啥意思就自己心领神会啦。

count 3
unique 3
top ming
freq 1
Name: name, dtype: object

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

value_counts方法

获取数据出现的频率。
value_counts是Series的方法,可以获取数据出现的次数。

常用参数:
normalize:将返回的值标准化,即所有返回值相加等于1。
sort:是否将返回的值排序,缺省按降序排序。
ascending:都懂
bins:对于数值型的数据类型,设置一个分组区间数量


查看年龄的分布情况:

print(df2.age.value_counts())

  
 
  • 1
17 2
18 1
Name: age, dtype: int64

  
 
  • 1
  • 2
  • 3

对数据分布进行一波标准化操作:

print(df2.age.value_counts(normalize=True))

  
 
  • 1
17 0.666667
18 0.333333
Name: age, dtype: float64

  
 
  • 1
  • 2
  • 3

设置区间段
(数据量磕碜了点哈)

print(df2.age.value_counts(bins=2))

  
 
  • 1
(16.997999999999998, 17.5] 2
(17.5, 18.0] 1
Name: age, dtype: int64

  
 
  • 1
  • 2
  • 3

分组与聚合计算

哎,我实在是受不了了,我要换大数据集了。
VX搜一下我的号,“Look Future”,回复飞机票数据拿一下数据集吧。(如果没有,跟我说一声儿)

分组

然后让我们先把数据读出来:

df1 = pd.read_csv('flights.csv')
df2 = pd.read_csv('airlines.csv')	#早晚要读,那就一并读了吧

  
 
  • 1
  • 2

接下来,选取航班有延误的:

df1.loc[df1.ARR_DELAY>=0]

  
 
  • 1

再通过航空公司进行分组:

df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE')

  
 
  • 1

对每个航空公司的航班延误次数进行统计:

df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count()

  
 
  • 1

之后再对统计出的数据进行一次排序,并将最终结果赋值给一个变量:

df_delat = df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count().sort_values(ascending=False)

  
 
  • 1
AIRLINE
WN 3694
DL 3468
AA 3418
UA 3176
OO 2863
EV 2472
MQ 1367
NK 820
F9 643
US 638
VX 423
AS 262
B6 250
HA 57
Name: AIRLINE, dtype: int64

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

最终呈现出结果如上。


合并两列数据

这里可真的是,卡了我十分钟,也不知道是我读书不认真还是怎么肥四。。。

前面不是读了个航空公司信息嘛,我们刚刚不也得到了延误航班的基础数据嘛,但是那些航空公司代码,你看得懂?
反正我是看不懂。这时候就需要将两组数据进行一个合并:

刚开始我是写这样的:

import pandas as pd
import numpy as np

df1 = pd.read_csv('flights.csv')

df_delay = df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count()

print(df_delay)

df2 = pd.read_csv('airlines.csv')
df2.set_index('IATA_CODE')

df2['delayed'] = df_delay
print(df2)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

结果发现插入的列全是NaN。

于是我就想啊,是不是不能这样简单粗暴?于是我就换了一套方法:index。
就把赋值那一行代码改成这样了:

df2.insert(len(df2.columns),'delayed',df_delay)

  
 
  • 1

好,运行,依旧不得行。

于是我怒了,我打开百度:
跟我说,是因为索引对不上。于是我把建立索引那一行去掉了,结果依旧是不行的。

直到后来,我看到了两个土办法:

import pandas as pd
import numpy as np


df1 = pd.read_csv('flights.csv')


df_delay = df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count()

print(df_delay)

df2 = pd.read_csv('airlines.csv')
#df2.set_index('IATA_CODE')

df2['delayed'] = list(df_delay)		#解决方案一
df2['delayed'] = df_delay.values	#解决方案二
#df2.insert(len(df2.columns),'delayed',df_delay)

print(df2)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

至于掺进agg进行混合计算,诸位自己试试哦。或者,下一篇的案例会出。

我歇会儿,起床后准备去参加华为鲲鹏的开发者技术峰会啦
在这里插入图片描述

文章来源: lion-wu.blog.csdn.net,作者:看,未来,版权归原作者所有,如需转载,请联系作者。

原文链接:lion-wu.blog.csdn.net/article/details/111906615

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。