本节主要讲解的是pandas的使用。
numpy已经能够帮助我们处理数据,能够结合matplotlib解决我们数据分析的问题,那么pandas学习的目的在什么地方呢?
numpy能够帮我们处理处理数值型数据,但是这还不够
很多时候,我们的数据除了数值之外,还有字符串,还有时间序列等
比如:我们通过爬虫获取到了存储在数据库中的数据
比如:之前youtube的例子中除了数值之外还有国家的信息,视频的分类(tag)信息,标题信息等
所以,numpy能够帮助我们处理数值,但是pandas除了处理数值之外(基于numpy),还能够帮助我们处理其他类型的数据
pandas的常用数据类型
Series 一维,带标签数组
DataFrame 二维,Series容器
1. Series
Series创建
import numpy as np
import pandas as pd
import string
t = pd.Series(np.arange(10),index = list(string.ascii_uppercase[:10]))
print(t,type(t))
执行结果为:
A 0
B 1
C 2
D 3
E 4
F 5
G 6
H 7
I 8
J 9
dtype: int32 <class ‘pandas.core.series.Series’>
#字典推导式创建一个字典i
a = {string.ascii_uppercase[i]:i for i in range(10)}
print(a)
#再通过字典创建Serious,可以发现字典就是索引的键
print(pd.Series(a))
运行结果为:
{‘A’: 0, ‘B’: 1, ‘C’: 2, ‘D’: 3, ‘E’: 4, ‘F’: 5, ‘G’: 6, ‘H’: 7, ‘I’: 8, ‘J’: 9}
A 0
B 1
C 2
D 3
E 4
F 5
G 6
H 7
I 8
J 9
dtype: int64
t = pd.Series(a,index = list(string.ascii_uppercase[5:15]))
print(t,type(t))
重新给其指定其他的索引后,如果能够对应上就取其值,否则就是NAN
Series切片和索引
2. DataFrame
pandas之读取外部数据
我们的这组数据存在csv中,我们直接使用pd. read_csv即可
和我们想象的有些差别,我们以为他会是一个Series类型,但是他是一个DataFrame,那么接下来我们就来了解这种数据类型
但是,还有一个问题:
对于数据库比如mysql或者mongodb中数据我们如何使用呢?
pd.read_sql(sql_sentence,connection)
print(pd.DataFrame(np.arange(12).reshape(3,4)))
运行结果为:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
DataFrame对象既有行索引,又有列索引
行索引,表明不同行,横向索引,叫index,0轴,axis=0
列索引,表名不同列,纵向索引,叫columns,1轴,axis=1
print(pd.DataFrame(np.arange(12).reshape(3,4),index = list(string.ascii_uppercase[:3]),columns = list(string.ascii_uppercase[-4:])))
运行结果为:
W X Y Z
A 0 1 2 3
B 4 5 6 7
C 8 9 10 11
t = pd.DataFrame(np.arange(12).reshape(3,4),index = list(string.ascii_uppercase[:3]),columns = list(string.ascii_uppercase[-4:]))
print(t.shape)
运行结果为:
(3, 4)
现在假设我们有一个组关于狗的名字的统计数据,那么为了观察这组数据的情况,我们应该怎么做呢?
我们想利用一个狗狗名字的数据进行测试:
首先我们需要读入一个.csv文件。(需要测试文件的下方评论区留邮箱)然后再对名字进行排序。
A = pd.read_csv("./dogNames2.csv")
print(A.sort_values(by="Count_AnimalName",ascending=False))
“./”还记得吧,指当前文件夹,如果忘了就是没好好看之前的python回顾课哦。
loc与iloc
df.loc 通过标签索引行数据
df.iloc 通过位置获取行数据
print(t.loc[["A","C"],["W","Z"]],"\n")
print(t.loc["A":,["W","Z"]],"\n")
print(t.loc["A":"C",["W","Z"]],"\n")
print(t.loc["A",["W","Z"]],"\n")
print(t.iloc[1:3,[2,3]],"\n")
print(t.iloc[1:3,1:3],"\n")
#更改数值
t.loc["A","Y"] = 100
print(t,"\n")
t.iloc[1:2,0:2] = 200
print(t,"\n")
运行结果为:
W Z
A 0 3
C 8 11
W Z
A 0 3
B 4 7
C 8 11
W Z
A 0 3
B 4 7
C 8 11
W 0
Z 3
Name: A, dtype: int32
Y Z
B 6 7
C 10 11
X Y
B 5 6
C 9 10
W X Y Z
A 0 1 100 3
B 4 5 6 7
C 8 9 10 11
W X Y Z
A 0 1 100 3
B 200 200 6 7
C 8 9 10 11
布尔索引
回到之前狗的名字的问题上,假如我们想找到所有的使用次数超过800的狗的名字,应该怎么选择?
print(A[A["Count_AnimalName"]>800])
运行结果为:
Row_Labels Count_AnimalName
1156 BELLA 1195
2660 CHARLIE 856
3251 COCO 852
9140 MAX 1153
12368 ROCKY 823
假如我们想找到所有的使用次数超过700并且名字的字符串的长度大于4的狗的名字,应该怎么选择?
print(A[(A["Row_Labels"].str.len()>4)&(A["Count_AnimalName"]>700)])
运行结果为:
Row_Labels Count_AnimalName
1156 BELLA 1195
2660 CHARLIE 856
8552 LUCKY 723
12368 ROCKY 823
下面列举了一些常用的字符串方法:
缺失数据的处理
我们的数据缺失通常有两种情况:
一种就是空,None等,在pandas是NaN(和np.nan一样)
另一种是我们让其为0,蓝色框中
对于NaN的数据,在numpy中我们是如何处理的?
在pandas中我们处理起来非常容易
判断数据是否为NaN:pd.isnull(df),pd.notnull(df)
处理方式1:删除NaN所在的行列dropna (axis=0, how=‘any’, inplace=False)
处理方式2:填充数据,t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)
处理为0的数据:t[t==0]=np.nan
当然并不是每次为0的数据都需要处理
计算平均值等情况,nan是不参与计算的,但是0会