Pandas基础知识


安装 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	10116:30
1	10216:30
2	10316:30
3	10416:30
4	10516:30
5	106			西		16:30
6	107			西		16:30
7	10816:30
8	10916:30
7.1 选择字符串内数据

选择东、南方向的房屋信息

str=['东','南']
room1=room[room['房屋朝向'].isin(str)]
room1

输出:

	房号	房屋朝向		时间
0	10116:30
1	10216:30
2	10316:30
4	10516:30
7	10816:30
8	10916: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	10116-30
1	10216-30
2	10316-30
3	10416-30
4	10516-30
5	106			西		16-30
6	107			西		16-30
7	10816-30
8	10916-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指定分隔符,默认为逗号 ’ , ’
delimiterstr,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")

(完。)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shi_jiaye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值