跟我一起学点 数据分析 -- 第四天:上手pandas(4)
前文回顾
大数据排序
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:str 或 list,按照列名排序
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
- 点赞
- 收藏
- 关注作者
评论(0)