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

268 阅读6分钟

在这里插入图片描述

文章目录

前文回顾

跟我一起学点 数据分析 – 第三天:上手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)

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

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

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

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)

看一下结果啊:

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

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

那,如果索引列不是阿拉伯数字,而是字符串呢?
啊,不知道各位有没有听说过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)
       age city
name           
hong    18   杭州
ming    17   北京
zhang   17   上海

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

别问,问就是不知道。


sort_values方法

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

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

按照年龄进行逆向排序

# 创建含有空格的数据
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)
       age city
name           
hong    18   杭州
ming    17   北京
zhang   17   上海

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

df2.sort_values(['age','name'],ascending=False,,inplace = True)
       age city
name           
hong    18   杭州
zhang   17   上海
ming    17   北京

数据计算

加减乘除啥的我就不讲了吧,数值计算函数有: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']))	# 一个一个没意思,直接一批吧
max     18.000000
min     17.000000
mean    17.333333
sum     52.000000
Name: age, dtype: float64

数据分析常用计算方法

describe方法

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

常用参数:include、exclude

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

print(df2.describe().T)	#这里的T是干嘛的,矩阵转置啊。
     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

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

如果你这样指定了列:

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

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

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

换个字符串列来试试看:

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

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

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

value_counts方法

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

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


查看年龄的分布情况:

print(df2.age.value_counts())
17    2
18    1
Name: age, dtype: int64

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

print(df2.age.value_counts(normalize=True))
17    0.666667
18    0.333333
Name: age, dtype: float64

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

print(df2.age.value_counts(bins=2))
(16.997999999999998, 17.5]    2
(17.5, 18.0]                  1
Name: age, dtype: int64

分组与聚合计算

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

分组

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

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

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

df1.loc[df1.ARR_DELAY>=0]

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

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

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

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

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

df_delat = df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count().sort_values(ascending=False)
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

最终呈现出结果如上。


合并两列数据

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

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

刚开始我是写这样的:

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)

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

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

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

好,运行,依旧不得行。

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

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

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)

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

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