和Numpy最大的不同,Pandas的数据有对应的index。
一、Series数组
Series 是带有标签的一维数组,可以保存任何数据类型(整数,字符串,浮点数,Python对象等),轴标签统称为索引
- 创建Series数组
# 创建 Series 数据类型有三种方法
#1. 从列表创建 Series
arr = [0, 1, 2, 3, 4]
s1 = pd.Series(arr) # 如果不指定索引,则默认从 0 开始
print(s1)输出结果:
0 0
1 1
2 2
3 3
4 4
dtype: int64————————————————————————————————————————————————
#2. 从加入索引创建 Series
index = ['a' , 'b' , 'c' , 'd' , 'e']
n=[1,2,3,4,5]
s2 = pd.Series(n, index=index)
print(s2)输出结果:
a 1
b 2
c 3
d 4
e 5
dtype: int64——————————————————————————————————————————————————
#3.从字典创建 Series
d={'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
s3=pd.Series(d)
print(s3)输出结果:
a 1
b 2
c 3
d 4
e 5
dtype: int64
- 查看Series的数据,数据类型 values,index,dtype
- 查看Series的描述性信息 describe()
- 索引操作
index = ['a' , 'b' , 'c' , 'd' , 'e']
n=[1,2,3,4,5]
s2 = pd.Series(n, index=index)输出:
a 1
b 2
c 3
d 4
e 5
dtype: int64——————————————————————————————————————————————————
# 1、位置下标,类似序列
print(s[0])
print(s[3]输出:
1
4——————————————————————————————————————————————————
# 2、标签索引,方法类似下标索引,用[]表示,内写上index,注意index是字符串。
print(s['a'])
print(s[['b','e']]) #如果需要选择多个标签的值,用[[]]来表示(相当于[]中包含一个列表)输出结果:
1b 2
e 5——————————————————————————————————————————————————
# 3、切片索引
print(s[1:3])
print(s['a':'c'])输出结果:
b 2
c 3
dtype: int64a 1
b 2
c 3
dtype: int64——————————————————————————————————————————————————
#4、布尔型索引
index = ['a' , 'b' , 'c' , 'd' , 'e']
n=[20,2,13,None,7]
s = pd.Series(n, index=index)
print(s)输出结果:
a 20.0
b 2.0
c 13.0
d NaN
e 7.0
dtype: float64----------------------
bls = s>10
print(bls)
print(s[s>10])
# 数组做判断之后,返回的是一个由布尔值组成的新的数组
# 以判断条件作为索引,只输出True部分数值输出结果:
a True
b False
c True
d False
e False
dtype: boola 20.0
c 13.0
dtype: float64----------------------
bls = s.notnull()
print(bls)
print(s[bls])
# .isnull() / .notnull() 判断是否为空值,返回的也是一个由布尔值组成的新的数组(None代表空值,NaN代表有问题的数值,两个都会识别为空值)输出结果:
a True
b True
c True
d False
e True
dtype: boola 20.0
b 2.0
c 13.0
e 7.0
dtype: float64
- Series的基本操作
(1)# 数据查看 .head() / .tail() 查看前5行数据,和后5行数据
二、Dataframe数组
"二维数组"Dataframe:是一个表格型的数据结构,包含一组有序的列,其列的值类型可以是数值、字符串、布尔值等。
- 创建DataFrame数组
# Dataframe 数据结构
# Dataframe是一个表格型的数据结构,“带有标签的二维数组”。
# Dataframe带有index(行标签)和columns(列标签)#导入pandas包
import pandas as pd#第1步:定义一个字典,映射列名与对应列的值
salesDict={'购药时间':['2018-01-01 星期五','2018-01-02 星期六','2018-01-06 星期三'],'社保卡号':['001616528','001616528','0012602828'],'商品编码':[236701,236701,236701],'商品名称':['强力VC银翘片','清热解毒口服液','感康'],'销售数量':[6,1,2],'应收金额':[82.8,28,16.8],'实收金额':[69,24.64,15]
}#导入有序字典
from collections import OrderedDict
#定义一个有序字典
salesOrderDict=OrderedDict(salesDict)#定义数据框:传入字典,列名
salesDf = pd.DataFrame(salesOrderDict)
print(salesDf)
结果输出:
- 查看行,列标签
print(salesDf.index) #查看DataFrame的行标签
print(salesDf.columns) #查看DataFrame的列标签输出结果:
RangeIndex(start=0, stop=3, step=1)
Index(['购药时间', '社保卡号', '商品编码', '商品名称', '销售数量', '应收金额', '实收金额'], dtype='object')
- 查看每一列数据的类型
- 查看描述性信息
- 数据查询
'''
loc属性用于根据索引index获取
''
1) 查询某一行的元素
2)查询某行特定列的元素
'''
iloc属性用于根据位置获取值,索引值从0开始
'''
1)查询某一行的数据
2)查询某行特定列的元素
【loc和iloc的区别】
从以上的案列中有点难理解这两种取值的函数有什么不同,下面换个例子详细说明
# loc 和 iloc 的区别
#1. 利用loc、iloc提取行数据import numpy as np
import pandas as pd
#创建一个Dataframe
data=pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('ABCD'))In[1]: data
Out[1]: A B C D
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15#取索引为'a'的行
In[2]: data.loc['a'] # loc根据index值获取
Out[2]:
A 0
B 1
C 2
D 3In[3]: data.iloc[0] #iloc根据下位置下标获取
Out[3]:
A 0
B 1
C 2
D 3
#取第一行数据,索引为'a'的行就是第一行,所以结果相同
# 2. 利用loc、iloc提取列数据In[4]:data.loc[:,['A']] #取'A'列所有行,多取几列格式为 data.loc[:,['A','B']]
Out[4]: A
a 0
b 4
c 8
d 12In[5]:data.iloc[:,[0]] #取第0列所有行,多取几列格式为 data.iloc[:,[0,1]]
Out[5]: A
a 0
b 4
c 8
d 12
# 3.利用loc、iloc提取指定行、指定列数据In[6]:data.loc[['a','b'],['A','B']] #提取index为'a','b',列名为'A','B'中的数据
Out[6]: A B
a 0 1
b 4 5In[7]:data.iloc[[0,1],[0,1]] #提取第0、1行,第0、1列中的数据
Out[7]: A B
a 0 1
b 4 5
总结:涉及到具体行或列的名字,用loc,只看位置,用iloc
'''
通过切片功能获取元素(这个方法也很常用)
'''
- 指定列名获取
- 切片索引获取某个范围内的信息
'''
复杂数据框查询数据,通过条件判断筛选
'''
- 新增列
- 删除行 / 列 del / drop()
# del 语句删除 ——删除列
# drop() #默认删除行,inplace=False → 删除后生成新的数据,不改变原数据
# drop()改变参数axis = 1 ,也可以删除列,inplace=True,原数据会被改变
- 排序
# 排序1 - 按值排序 .sort_values,参数 ascending = True →升序;反之,降序
同样适用于Series
# 排序2 - 索引排序 .sort_index
# 按照index排序
# 默认 ascending=True (升序), inplace=False(不修改原数据,返回新的数据)
- 读取外部文件,很多时候需要导入外部的excel,csv,图片等格式的文件进行数据处理
关于这一点最重要的是主要外部文件和本身python工程文件的相对位置,位置不对,python就不能正确找到。
#读取Ecxcel数据
fileNameStr='./朝阳医院2018年销售数据.xlsx'
xls = pd.ExcelFile(fileNameStr)
salesDf = xls.parse('Sheet1')
- 数值计算和统计方法
- 求均值 .mean()
按照列进行计算只统计数字列
可以通过索引单独统计一列
2. 统计数量 .count() →统计非Na值的数量
按照列进行计算
可以通过索引单独统计一列
3. 其他同理
- 求和: df.sum()
- 求最大最小值: df.min() / df.max()
- 求中位数: df.median()
- 求标准差,方差: df.std() / df.var()
- 去重 .duplicated()
# Series 和 Dataframe都可以用这个函数#1、Series
#导包
import pandas as pds = pd.Series([1,1,1,1,2,2,2,3,4,5,5,5,5])
print(s.duplicated())
print(s[s.duplicated() == False])
# 判断是否重复
# 通过布尔判断,得到不重复的值输出结果:
0 False
1 True
2 True
3 True
4 False
5 True
6 True
7 False
8 False
9 False
10 True
11 True
12 True
dtype: bool0 1
4 2
7 3
8 4
9 5
dtype: int64—————————————————————————————————————————————————
s = pd.Series([1,1,1,1,2,2,2,3,4,5,5,5,5])
s_re = s.drop_duplicates()
print(s)
print(s_re)
# drop.duplicates移除重复
# inplace参数:是否替换原值,默认False,不替换。输出结果:
0 1
1 1
2 1
3 1
4 2
5 2
6 2
7 3
8 4
9 5
10 5
11 5
12 5
dtype: int640 1
4 2
7 3
8 4
9 5
dtype: int64——————————————————————————————————————————————————
df = pd.DataFrame({'key1':['a','a',3,4,5],'key2':['a','a','b','b','c']})
print(df.duplicated())
print(df['key2'].duplicated())
# Dataframe中使用duplicated输出结果:key1 key2
0 a a
1 a a
2 3 b
3 4 b
4 5 c
0 False
1 True
2 False
3 False
4 False
dtype: bool
0 False
1 True
2 False
3 True
4 False
Name: key2, dtype: bool
#然后再利用布尔型索引方式去除重复值即可。
数据分析中pandas可能用到的知识点汇总至此,在学习的过程中会不断补充... ...