安装 pandas:pip install pandas
Pandas 中主要使用 Series 和 DataFrame 两种数据结构。
1. Series
1.1 Series 创建
Series 是一种类似于一维数组的对象,它由一组数据和一组与之相关的索引组成。Series 一般有四种创建方法。
(1)列表
(2)标量值
import pandas as pd
a=pd.Series(25,index=['a','b','c'])
print(a)
输出:
a 25
b 25
c 25
dtype: int64
(3)python 字典
import pandas as pd
data={'o':3500,'t':7100,'u':5000}
a=pd.Series(data)
print(a)
输出:
o 3500
t 7100
u 5000
dtype: int64
(4)ndarray
import numpy as np
import pandas as pd
a=pd.Series(np.arange(5),index=np.arange(9,4,-1))
print(a)
输出:
9 0
8 1
7 2
6 3
5 4
dtype: int32
1.2 Series 操作
Series 操作一般包括三种类型。
(1)index 和 values 操作
通过 Series 实现获取索引和取值的操作。
a.index
a.values
(2)索引和切片操作
可以采用类似于 ndarray 类型索引和切片操作。
(3)字典类型操作
可以采用类似于 python 字典类型操作。
2. DataFrame 创建
DataFrame 是一个表达二维的表格型数据结构,也可以表达多维数据。
DataFrame 对象既有行索引,又有列索引。其中,行索引表明不同行,横向索引。列索引表明不同列,纵向索引。
2.1 由二维 ndarray 对象创建
from pandas import DataFrame
df=DataFrame([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], # 设置值
index=list(['第一行','第二行','第三行','第四行']), # 设行索引
columns=list(['第一列','第二列','第三列','第四列'])) # 设列索引
print(df)
输出:
第一列 第二列 第三列 第四列
第一行 1 2 3 4
第二行 5 6 7 8
第三行 9 10 11 12
第四行 13 14 15 16
2.2 由字典创建
from pandas import DataFrame as df
student={'name':['小王','晓东','小敏'],
'sage':[22,21,20],
'ssex':['man','man','women']}
a=df(student)
print(a)
输出:
name sage ssex
0 小王 22 man
1 晓东 21 man
2 小敏 20 women
2.3 DataFrame 基础属性和基本操作
1.基础属性
- | - |
---|---|
df.shape | 行数和列数 |
df.dtype | 列数据类型 |
df.ndim | 数据维度 |
df.index | 行索引 |
df.columns | 列索引 |
df.values | 对象值 |
2.基本操作
- | - |
---|---|
df.head(3) | 显示前 3 行 |
df.tail(3) | 显示末尾 3 行 |
df.info() | 显示信息概述,行数,列数,索引,列非空值个数,列类型等。 |
df.describe() | 统计信息,均值,最大值,最小值,标准差等。 |
练习题:
根据以下成绩。创建一个 DataFrame,命名为df
张三:数学:150,语文:150,英语:150,理综:300
李四:数学:0,语文:0,英语:0,理综:0
from pandas import DataFrame as df
a=df([[150,150,150,150],[0,0,0,0]],
index=list(['张三','李四']),
columns=list(['数学','语文','英语','理综']))
print(a)
输出:
数学 语文 英语 理综
张三 150 150 150 150
李四 0 0 0 0
3. 索引操作
3.1 通过标签索引
标签索引通过 df.loc 实现,一般获取行数据。
from pandas import DataFrame as df
student={'name':['小王','晓东','小敏'],
'sage':[22,21,20],
'ssex':['man','man','woman']}
student=df(student)
student
输出:
name sage ssex
0 小王 22 man
1 晓东 21 man
2 小敏 20 woman
(1)获取 1 号和 2 号同学的姓名和年龄
student.loc[[0,1],['name','sage']]
输出:
name sage
0 小王 22
1 晓东 21
(2)获取每一位同学的姓名和性别
# student.loc[0:,['name','ssex']]
# 或者
student.loc[0:2,['name','ssex']]
输出:
name ssex
0 小王 man
1 晓东 man
2 小敏 woman
3.2 通过位置索引
位置索引通过 df.iloc 实现,一般获取行数据。
(1)获取 1 号和 2 号同学的姓名和年龄
student.iloc[[0,1],[0,1]]
输出:
name sage
0 小王 22
1 晓东 21
(2)获取每一位同学的姓名和性别
# student.iloc[0:,0:]
# 或者
student.iloc[0:3,0:3]
输出:
name sage ssex
0 小王 22 man
1 晓东 21 man
2 小敏 20 woman
3.3 布尔索引
布尔索引通过比较运算符实现。
(1)获取年龄在 21 岁以下同学信息
student['sage']<=21
输出:
0 False
1 True
2 True
Name: sage, dtype: bool
输出想要同学的信息:
student[student['sage']<=21]
输出:
name sage ssex
1 晓东 21 man
2 小敏 20 woman
(2)获取名字的字符串的长度大于 1 ,且年龄在 21 岁以下同学信息
student[(student['name'].str.len()>1) & (student['sage']<=21)]
输出:
name sage ssex
1 晓东 21 man
2 小敏 20 woman
3.4 对元素进行索引
(1)获取 1 号同学的姓名
# student.loc[0,'name']
# 或者
student.iloc[0,0]
输出:
'小王'
(2)将 2 号同学的年龄改为23岁
student.loc[1,'sage']=23
student.loc[1,'sage']
# 或者
# student.iloc[1,1]=23
# student.iloc[1,1]
输出:
23
3.5 删除指定索引对象
drop() 能够删除 DataFrame 指定行或列索引。
(1)将 1 号同学的信息删除
student=student.drop([0])
student
输出:
name sage ssex
1 晓东 21 man
2 小敏 20 woman
(2)将同学的年龄信息删除
student=student.drop(['sage'],axis=1)
student
输出:
name ssex
1 晓东 man
2 小敏 woman
4. 合并操作(merge,join)
4.1 join
join 表示把行索引相同的数据合并到一起
from pandas import DataFrame
a1=DataFrame([[1,2],[5,6]], # 设置值
index=list(['第一行','第二行']), # 设行索引
columns=list(['第一列','第二列'])) # 列索引
a2=DataFrame([[9,10],[13,14]], # 设置值
index=list(['第一行','第二行']), # 设置索引
columns=list(['第三列','第四列'])) # 列索引
a1.join(a2)
输出:
第一列 第二列 第三列 第四列
第一行 1 2 9 10
第二行 5 6 13 14
4.2 merge
merge 表示按照指定的列把数据按照一定的方式合并到一起
from pandas import DataFrame
a1=DataFrame([[1,2],[5,6]], # 设置值
index=list(['第一行','第二行']), # 设行索引
columns=list(['第一列','第二列'])) # 列索引
a2=DataFrame([[2,5],[3,8]], # 设置值
index=list(['第一行','第二行']), # 设置索引
columns=list(['第三列','第四列'])) # 列索引
a1.merge(a2,left_on="第二列",right_on="第三列")
输出:
第一列 第二列 第三列 第四列
0 1 2 2 5
合并方式包括四种,通过 how 属性设置:
(1) 默认的为并集 inner
a1.merge(a2,left_on="第二列",right_on="第三列",how='inner')
输出:
第一列 第二列 第三列 第四列
0 1 2 2 5
(2) 交集 outer,NaN 补全
a1.merge(a2,left_on="第二列",right_on="第三列",how='outer')
输出:
第一列 第二列 第三列 第四列
0 1.0 2.0 2.0 5.0
1 5.0 6.0 NaN NaN
2 NaN NaN 3.0 8.0
(3) 左边为准 left,NaN 补全
a1.merge(a2,left_on="第二列",right_on="第三列",how='left')
输出:
第一列 第二列 第三列 第四列
0 1 2 2.0 5.0
1 5 6 NaN NaN
(4) 右边为准 right,NaN 补全
a1.merge(a2,left_on="第二列",right_on="第三列",how='right')
输出:
第一列 第二列 第三列 第四列
0 1.0 2.0 2 5
1 NaN NaN 3 8
5.统计操作
5.1 常用统计函数
方法 | 说明 |
---|---|
.sum() | 计算数据的总和,按 0 轴计算,下同 |
.count() | 非 NaN 值得数量 |
.mean() .median() | 计算数据的算术平均值、算术中位数 |
.var() .std() | 计算数据的方差、标准差 |
.min() .max() | 计算数据的最小值、最大值 |
.describe() | 输出所有列的统计信息 |
.info() | 检查缺失值情况 |
from pandas import DataFrame as df
student={'name':['小王','晓东','小敏'],
'sage':[22,21,20],
'ssex':['man','man','woman']}
student=df(student)
student
输出:
name sage ssex
0 小王 22 man
1 晓东 21 man
2 小敏 20 woman
(1)统计所有学生的年龄总和
student['sage'].sum()
输出:
63
(2)统计所有学生年龄的最大值
student['sage'].max()
输出:
22
5.2 相关性统计分析
相关性
- X 增大,Y 增大,两个变量正相关
- X 增大,Y 减小,两个变量负相关
- X 增大,Y 无视,两个变量不相关
协方差 (存在相关性)
- 协方差>0,X 和 Y 正相关
- 协方差<0,X 和 Y 负相关
- 协方差=0,X 和 Y 独立无关
相关分析函数包括 cov() 和 corr() 等。
方法 | 说明 |
---|---|
cov() | 计算协方差矩阵 |
corr() | 计算相关系数矩阵,例如 Pearson、Spearman、Kendall 等 |
from pandas import DataFrame as df
df=df({"A":[5,3,6,4],
"B":[11,2,4,3],
"C":[4,3,8,5],
"D":[5,4,2,8]})
df
输出:
A B C D
0 5 11 4 5
1 3 2 3 4
2 6 4 8 2
3 4 3 5 8
统计表中各列的相关性
df.cov()
输出:
A B C D
A 1.666667 2.333333 2.333333 -1.500000
B 2.333333 16.666667 -1.000000 0.000000
C 2.333333 -1.000000 4.666667 -2.333333
D -1.500000 0.000000 -2.333333 6.250000
5.3 分组统计
GroupBy 技术是对于数据进行分组计算并将各组计算结果合并的一项技术,包括以下 3 个过程:
(1)拆分(Spliting):即将数据进行分组
(2)应用(Applying):对每组应用函数进行计算
(3)合并(Combining):将计算结果进行数据聚合
使用 GroupBy() 可以沿着任意轴进行分组,并且将分组依据的键作为每组的组名,有以下 3 种用法:
(1)df.groupby(key)
(2)df.groupby(key,axis=1)
(3)df.groupby([key1,key2])
其中的参数 axis ,可以设置是横向分组还是纵向分组,默认是横向分组(axis=0)。
创建学生表:
from pandas import DataFrame as df
student=df([['A','male',95,79],
['B','female',85,85],
['C','male',93,92],
['B','female',84,90],
['B','male',88,70],
['C','male',59,89],
['A','male',89,86],
['B','male',89,74]],
columns=list(['班级','性别','数学','语文']))
student
输出:
班级 性别 数学 语文
0 A male 95 79
1 B female 85 85
2 C male 93 92
3 B female 84 90
4 B male 88 70
5 C male 59 89
6 A male 89 86
7 B male 89 74
(1)统计每个班分数的总和
student.groupby('班级').sum()
输出:
数学 语文
班级
A 184 165
B 346 319
C 152 181
(2)将每个班按照性别统计均值
student.groupby(['班级','性别']).mean()
输出:
数学 语文
班级 性别
A male 92.0 82.5
B female 84.5 87.5
male 88.5 72.0
C male 76.0 90.5
6.数据排序
6.1 sort_values
该方法根据 数据 进行排序,可以分为 sort column 和 sort by column,注意加以区分。
(colname表示列名)
1.sort column
这种方法是从 DataFrame 中挑取出来具体的列,然后对该行进行排序。操作的是 特定 的行。
dataframe.colname.sort_values()
dataframe.colname.sort_values(ascending=False)
dataframe["colname"].sort_values()
dataframe["colname"].sort_values(ascending=False)
2.sort by column
这种方法是按照给定的列的值对 DataFrame 数据进行排序,与上一种区别在于操作的是 整个 DataFrame。
# 单列 sort
dataframe.sort_values("colname")
# 多列 sort
dataframe.sort_values("col1","col2",..."coln")
6.2 sort_index
该方法可以根据 行名 排序,也可以根据列名排序,区别在于 axis。
# 1.axis=0 给列名排序,ascending 指定排序方法
dataframe.sort_index()
dataframe.sort_index(ascending=False)
# 2.axis=1 给行名排序,ascending 指定排序方法
dataframe.sort_index(axis=1)
dataframe.sort_index(ascending=False,axis=1)
7.字符串操作
房屋表:
import pandas as pd
from pandas import DataFrame as df
room=df([['101','东','16:30'],
['102','南','16:30'],
['103','南','16:30'],
['104','北','16:30'],
['105','东','16:30'],
['106','西','16:30'],
['107','西','16:30'],
['108','南','16:30'],
['109','东','16:30']],
columns=list(['房号','房屋朝向','时间'])) # 列索引
room
输出:
房号 房屋朝向 时间
0 101 东 16:30
1 102 南 16:30
2 103 南 16:30
3 104 北 16:30
4 105 东 16:30
5 106 西 16:30
6 107 西 16:30
7 108 南 16:30
8 109 东 16:30
7.1 选择字符串内数据
选择东、南方向的房屋信息
str=['东','南']
room1=room[room['房屋朝向'].isin(str)]
room1
输出:
房号 房屋朝向 时间
0 101 东 16:30
1 102 南 16:30
2 103 南 16:30
4 105 东 16:30
7 108 南 16:30
8 109 东 16:30
7.2 字符串映射数字
将房屋的朝向数字化为1,2,3,4
label_mapping={"东":1,"南":2,"西":3,"北":4}
room['房屋朝向']=room.房屋朝向.map(label_mapping)
room
输出:
房号 房屋朝向 时间
0 101 1 16:30
1 102 2 16:30
2 103 2 16:30
3 104 4 16:30
4 105 1 16:30
5 106 3 16:30
6 107 3 16:30
7 108 2 16:30
8 109 1 16:30
7.3 时间字符串转时间格式
将时间按照格式“H-M”输出
import datetime
room['时间']=pd.to_datetime(room['时间'],format='%H:%M')
# 转时间格式
room['时间']=room['时间'].apply(lambda x:datetime.datetime.strftime(x,'%H-%M'))
# 将时间按格式输出
room
输出:
房号 房屋朝向 时间
0 101 东 16-30
1 102 南 16-30
2 103 南 16-30
3 104 北 16-30
4 105 东 16-30
5 106 西 16-30
6 107 西 16-30
7 108 南 16-30
8 109 东 16-30
8.文件操作
8.1 读入文件
pd.read_csv(filepath_or_buffer,sep=',',delimiter=None,header='infer',names=None,index_col=None,prefix=None,nrows=None,encoding=None,skiprows=0)
参数:
- | - |
---|---|
filepath_or_buffer | 文件所在的路径 |
sep | 指定分隔符,默认为逗号 ’ , ’ |
delimiter | str,default None 定界符,备选分隔符(如果指定该参数,则 sep 参数失效) |
header | 指定哪一行作为表头。默认设置为 0 (即第一行作为表头),如果没有表头的话,要修改参数,设置 header=None |
names | 指定列的名称,用列表表示。一般我们没有表头,即 header=None 时,这个用来添加列名就很有用啦 |
index_col | 指定哪一列数据作为行索引,可以是一列,也可以多列。多列的话,会看到一个分层索引 |
prefix | 给列名添加前缀。如 prefix=“x”,会出来 “x1”、“x2”、“x3” |
nrows | 需要读取的行数(从文件头开始算起) |
encoding | 乱码的时候用这个就是了 |
skiprows | 忽略的行数(从文件开始处算起),或需要跳过的行号列表(从 0 开始)。 |
8.2 保存文件
to_csv(path_or_buf,sep,na_rep,columns,header,index)
参数:
- | - |
---|---|
path_or_buf | 字符串,放文件名、相对路径、文件流等 |
sep | 字符串,分隔符,跟 read_csv()的一个意思 |
na_rep | 字符串,将 NaN 转换为特定值 |
columns | 列表,指定哪些列写进去 |
header | 默认 header=0,如果没有表头,设置 header=None,表示没有表头 |
index | 关于索引的,默认True,写入索引 |
eg:
import numpy as np
df=pd.DataFrame({"a":[1,2,3],
"b":[6,np.nan,6],
"c":[3,4,np.nan]})
df.to_csv(path)
df.to_csv(path,header=None)
df.to_csv(path,columns=["a","c"],index=False)
df.to_csv(path,na_rep=0)
8.3 按格式输出
DataFrame.to_html("test.html")
(完。)