Python --Pandas库基础方法(1)

Pandas

Pandas 是 Python 中一个非常强大的数据处理库,它提供了快速、灵活和表达式丰富的数据结构,旨在使“关系”或“标签”数据的处理工作变得既简单又直观。Pandas 非常适合于数据清洗和准备阶段,以便进行进一步的分析和建模。

主要数据结构

  1. Series:一维的、大小可变的、潜在异构的、索引化的数组类型。它可以被看作是一个定长的有序字典(每个元素都有一个标签,即索引)。
  2. DataFrame:二维的、大小可变的、潜在异构的、表格型的数据结构,具有标记的轴(行和列)。你可以将其想象成一个 SQL 表或者 Excel 的数据表

Pandas 的安装

Pandas 可以通过 pip 安装:

pip install pandas

导包:

import pandas as pd

Series对象创建

Series:一维数组,与Numpy中的一维array类似。它是一种类似于一维数组的对象,是由一组数据(各种 NumPy 数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series 对象。用值列表生成 Series 时,Pandas 默认自动生成整数索引 。

使用列表创建

import pandas as pd
#serise对象创建
#使用列表创建serise对象
data = pd.Series([4,3,5,6,1])
data
--------------
0    4
1    3
2    5
3    6
4    1			#同时生成索引与值
dtype: int64

调取值与索引

#values:是Series对象的原始数据。
#index:对应了Series对象的索引对象
#格式:data.values-----data.index

data.values
--------------
array([4, 3, 5, 6, 1], dtype=int64)
=========================================
data.index		#显示索引位置范围和步长
------------------
RangeIndex(start=0, stop=5, step=1)

指定index

自己命名索引,索引分为位置索引与名称索引,改变的是名称索引,但是位置索引和名称索引都还能使用,位置索引还是从0 开始:

#指定index  指定每个元素对应的索引
data = pd.Series([5,4,6,3,1],index = ['a','b','c','d','e'])
data
-------------
a    5
b    4
c    6
d    3
e    1
dtype: int64
===============================
#使用list列表指定index
data = pd.Series([4,3,2,1],index = list('abcd'))
data
----------------
a    4
b    3
c    2
d    1
dtype: int64

字典创建

传入字典创建,默认将key作为index。

#传入字典创建,默认将key作为index
population_dict = {'sh':2800,'bj':3000,'hf':2000}
population_series=pd.Series(population_dict)
population_series
-------------------------------
sh    2800
bj    3000
hf    2000
dtype: int64

如果既用了字典创建了Series对象,又显示的指定了index,如果key不存在,则值为NaN:

#如果既用了字典创建了Series对象,又显示的指定了index.
#如果key存在,取交集

sub_series=pd.Series(population_dict,index=['sh','hf'])
sub_series
-------------
sh    2800
hf    2000
dtype: int64
=================================
#如果key不存在,则值为NaN
sub_series=pd.Series(population_dict,index=['bj','nj'])
sub_series
-----------------------
bj    3000.0
nj       NaN
dtype: float64

标量与index对象一起传入创建

#将一个标量与index对象一起传入创建

data = pd.Series(10,index=list('abcd'))    #每个索引对应的都是输入的标量
data
----------------
a    10
b    10
c    10
d    10
dtype: int64

DataFrame对象创建

DataFrame 是 Pandas 中的一个表格型的数据结构,包含有一组序的列,每列可以是不同的值类型(数值、字符串、布尔型等)DataFrame 即有行索引也有列索引,可以被看做是由 Series 组成的字典。将两个series对象作为dict的value传入,就可以创建一个DataFrame象。

创建DataFrame对象

#DataFrame对象创建#将两个series对象作为dict的value传入,就可以创建一个DataFrame对象
population_dict={'beijing':3000,'shanghai':1200,'guangzhou':1800}
area_dict={'beijing':300,'shanghai':180,'guangzhou':200}#将两个字典转化为Series对象
population_series=pd.Series(population_dict)
area_series = pd.Series(area_dict)#将两个字典合并
citys=pd.DataFrame({'area':area_series,'population':population_series})
citys
-------------------------
			area	population
beijing		300			3000
shanghai	180			1200
guangzhou	200			1800

values、index、columns属性

#values、index、columns属性
#格式:citys.values -- citys.index -- citys.columns

#访问值
citys.values
array([[ 300, 3000],
       [ 180, 1200],
       [ 200, 1800]], dtype=int64)
=============================
#访问索引
citys.index
Index(['beijing', 'shanghai', 'guangzhou'], dtype='object')
====================================
#访问列名
citys.columns
Index(['area', 'population'], dtype='object')

列表创建

#列表创建

data = pd.DataFrame([population_dict,area_dict])
data
----------------------
	beijing	shanghai	guangzhou
0	3000		1200		1800
1	300			180			200
===============================================
#添加index属性(添加索引)
data = pd.DataFrame([population_dict,area_dict],index=['population','area'])
data
----------------
			beijing		shanghai	guangzhou
population		3000		1200		1800
area			300			180			200

索引columns的使用

#索引columns的使用   指定列名

population_series=pd.Series(population_dict)
pd.DataFrame(population_series,columns=['population'])
-------------------
			population
beijing			3000
shanghai		1200
guangzhou		1800
==========================================
#二位数组指定columns和index的创建
import numpy as np
pd.DataFrame(np.random.randint(0,10,(3,2)),columns=list('ab'),index=list('efg'))
#创建一个0-10的3*2的二位数组,令其列名为"a","b",索引为"e" ,"f" ,"g"。
	a	b
e	4	0
f	5	0
g	9	8

Pandas中的Index

Pandas中的Index,其实是不可变的一维数组

#pandas中的index----->不可变的一位数组
​
ind = pd.Index([3,4,5,6,7])
#根据下标获取值  从0开始
ind[3]
-------------
6
=====================
#切片获取值
ind[::2]   #隔两步取一片
----------------------------
Int64Index([3, 5, 7], dtype='int64')

导入csv文件

导入csv文件时除了指明文件路径,还需要设置编码格式。Python中用得比较多的两种编码格式是UTF-8和gbk,默认编码格式是UTF-8。我们要根据导入文件本身的编码格式进行设置,通过设置参数encoding来设置导入的编码格式。

txt和csv文件都可以用read_csv()方法读取:

#导入csv文件
#使用read_csv()方法导入文件,首先要指定文件的路径
​
pd.read_csv('./students.csv',encoding='utf8')
--------------------------------------
	1500100001	施笑槐	22	女	文科六班
0	1500100002	吕金鹏	24	男	文科六班
1	1500100003	单乐蕊	22	女	理科六班
2	1500100004	葛德曜	24	男	理科三班
3	1500100005	宣谷芹	22	女	理科五班
4	1500100006	边昂雄	21	男	理科二班
...	...	...	...	...	...
994	1500100996	厉运凡	24	男	文科三班
995	1500100997	陶敬曦	21	男	理科六班
996	1500100998	容昆宇	22	男	理科四班
997	1500100999	钟绮晴	23	女	文科五班
998	1500101000	符瑞渊	23	男	理科六班

但是上述直接导入,我们发现原本的第一行数据变成了列名,怎么改正它呢?

#添加header参数,令其为None
pd.read_csv('./students.csv',header = None,encoding='utf8')
----------------------------------------
		0		  1	  2	  3		 4
0	1500100001	施笑槐	22	女	文科六班
1	1500100002	吕金鹏	24	男	文科六班
2	1500100003	单乐蕊	22	女	理科六班
3	1500100004	葛德曜	24	男	理科三班
4	1500100005	宣谷芹	22	女	理科五班
...	...	...	...	...	...
995	1500100996	厉运凡	24	男	文科三班
996	1500100997	陶敬曦	21	男	理科六班
997	1500100998	容昆宇	22	男	理科四班
998	1500100999	钟绮晴	23	女	文科五班
999	1500101000	符瑞渊	23	男	理科六班

指定列名

stu_df= pd.read_csv('./students.csv',header = None,names = ["ID","name","age","gender","clazz"],encoding='utf8')
stu_df
------------------------------------
			ID	name age gender	clazz
0	1500100001	施笑槐	22	女	文科六班
1	1500100002	吕金鹏	24	男	文科六班
2	1500100003	单乐蕊	22	女	理科六班
3	1500100004	葛德曜	24	男	理科三班
4	1500100005	宣谷芹	22	女	理科五班
...	...	...	...	...	...
995	1500100996	厉运凡	24	男	文科三班
996	1500100997	陶敬曦	21	男	理科六班
997	1500100998	容昆宇	22	男	理科四班
998	1500100999	钟绮晴	23	女	文科五班
999	1500101000	符瑞渊	23	男	理科六班

指明分隔符读取

我们在拿到数据之后,一般用特殊符号将数据隔开,我们可以指定分隔符,读取文件:

pd.read_csv('./students.csv',header = None,sep = "#")

保存文件

stu_df.to_csv("xxx")	#输入保存的文件位置

了解数据

head()与tail()

当数据表中包含了数据行数过多时,而我们又想看一下每一列数据都是什么样的数据时,就可以把数据表中前几行或后几行数据显示出来进行查看。

head()方法返回前 n 行(观察索引值),显示元素的数量默认是 5,但可以传递自定义数值。

tail()方法返回后 n 行观察索引值),显示元素的数量默认是 5,但可以传递自定义数值。

#head()方法
#查看前几行数据
book_df.head()  #默认5行
#也可以自己输入数值,查看想看的行数
------------------------------
 		ID	    name age gender	clazz
0	1500100001	施笑槐	22	女	文科六班
1	1500100002	吕金鹏	24	男	文科六班
2	1500100003	单乐蕊	22	女	理科六班
3	1500100004	葛德曜	24	男	理科三班
4	1500100005	宣谷芹	22	女	理科五班
#tail()方法
#查看后几行数据  默认5行
book_df.tail()
#也可以自己输入数值,查看想看的行数
--------------------------------
			ID	name age gender	clazz
995	1500100996	厉运凡	24	男	文科三班
996	1500100997	陶敬曦	21	男	理科六班
997	1500100998	容昆宇	22	男	理科四班
998	1500100999	钟绮晴	23	女	文科五班
999	1500101000	符瑞渊	23	男	理科六班

info()

熟悉数据的第一点就是看下数据的类型,不同的数据类型的分析思路是不一样的,比如说数值类型的数据就可以求均值,但是字符类型的数据就没法求均值了。

info()方法查看数据表中的数据类型,而且不需要一列一列的查看,info()可以输出整个表中所有列的数据类型。

#info()-------->查看数据信息
​
book_df.info()
----------------------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   ID      1000 non-null   int64 
 1   name    1000 non-null   object
 2   age     1000 non-null   int64 
 3   gender  1000 non-null   object
 4   clazz   1000 non-null   object
dtypes: int64(2), object(3)
memory usage: 39.2+ KB

shape

熟悉数据的第二点就是看下数据表的大小,即数据表有多少行,多少列 。

shape方法会以元组的形式返回行、列数。注意 shape 方法获取行数和列数时不会把索引和列索引计算在内。

#shape------->查看行列数

book_df.shape
------------------
(1000, 5)  #一千行,5列

describe()

熟悉数据的第三点就是掌握数值的分布情况,即均值是多少,最值是多少,方差及分位数分别是多少 。

describe()方法就是可以就可以获取所有数值类型字段的分布值。

#describe()-------->获取所有数值类型字段的分布值
​
book_df.describe()
---------------------------
			ID				age
count	1.000000e+03	1000.000000		#总和
mean	1.500101e+09	22.521000		#平均值
std		2.888194e+02	1.113013		#方差
min		1.500100e+09	21.000000		#最小值
25%		1.500100e+09	22.000000		
50%		1.500101e+09	22.000000
75%		1.500101e+09	24.000000
max		1.500101e+09	24.000000		#最大值

列操作

提取列值

#提取列值
book_df['age']  #类切片操作,将age列的值都取出来
---------------------
0      22
1      24
2      22
3      24
4      22..
995    24
996    21
997    22
998    23
999    23
Name: age, Length: 1000, dtype: int64

提取多列:

book_df[['age','clazz']]	#将多个列名以列表形式输入

修改变量列

columns与rename()改名,columns不需要变量接受,rename()需要变量接受,否则没有修改成功。

#columns改名
​
book_df.columns=['a','b','c','d','e']
book_df
------------------------------------
			a	 b	  c	  d	     e
0	1500100001	施笑槐	22	女	文科六班
1	1500100002	吕金鹏	24	男	文科六班
2	1500100003	单乐蕊	22	女	理科六班
3	1500100004	葛德曜	24	男	理科三班
4	1500100005	宣谷芹	22	女	理科五班
...	...	...	...	...	...
995	1500100996	厉运凡	24	男	文科三班
996	1500100997	陶敬曦	21	男	理科六班
997	1500100998	容昆宇	22	男	理科四班
998	1500100999	钟绮晴	23	女	文科五班
999	1500101000	符瑞渊	23	男	理科六班
1000 rows × 5 columns
#rename()改名

new_book_df = book_df.rename(columns={'a':'g','c':'h'})
new_book_df    #以字典形式,将原列名输入,替换成新列名
-------------------------------------
		g		  b	  h	  d		 e
0	1500100001	施笑槐	22	女	文科六班
1	1500100002	吕金鹏	24	男	文科六班
2	1500100003	单乐蕊	22	女	理科六班
3	1500100004	葛德曜	24	男	理科三班
4	1500100005	宣谷芹	22	女	理科五班
...	...	...	...	...	...
995	1500100996	厉运凡	24	男	文科三班
996	1500100997	陶敬曦	21	男	理科六班
997	1500100998	容昆宇	22	男	理科四班
998	1500100999	钟绮晴	23	女	文科五班
999	1500101000	符瑞渊	23	男	理科六班
1000 rows × 5 columns

增加变量列

格式:

df[cloumn] = pd.Series([val,val2,val3],index=[c1,c2,c3])
#增加变量列
#直接给列名,然后给定值
​
book_df['ok'] = pd.Series(np.arange(10))
book_df
---------------------
		ID		name age gender	clazz	 ok
0	1500100001	施笑槐	22	女	文科六班	0.0
1	1500100002	吕金鹏	24	男	文科六班	1.0
2	1500100003	单乐蕊	22	女	理科六班	2.0
3	1500100004	葛德曜	24	男	理科三班	3.0
4	1500100005	宣谷芹	22	女	理科五班	4.0
...	...	...	...	...	...	...
995	1500100996	厉运凡	24	男	文科三班	NaN
996	1500100997	陶敬曦	21	男	理科六班	NaN
997	1500100998	容昆宇	22	男	理科四班	NaN
998	1500100999	钟绮晴	23	女	文科五班	NaN
999	1500101000	符瑞渊	23	男	理科六班	NaN

还可以令两个列相加合成一个新的列:

book_df["aaa"] = book_df["name"]+book_df["gender"]
book_df  #创建新的列"aaa",将"name"列与"gender"列放进去
----------------------
			ID	name age gender	clazz	  ok	aaa
0	1500100001	施笑槐	22	女	文科六班	0.0	施笑槐女
1	1500100002	吕金鹏	24	男	文科六班	1.0	吕金鹏男
2	1500100003	单乐蕊	22	女	理科六班	2.0	单乐蕊女
3	1500100004	葛德曜	24	男	理科三班	3.0	葛德曜男
4	1500100005	宣谷芹	22	女	理科五班	4.0	宣谷芹女
...	...	...	...	...	...	...	...
995	1500100996	厉运凡	24	男	文科三班	NaN	厉运凡男
996	1500100997	陶敬曦	21	男	理科六班	NaN	陶敬曦男
997	1500100998	容昆宇	22	男	理科四班	NaN	容昆宇男
998	1500100999	钟绮晴	23	女	文科五班	NaN	钟绮晴女
999	1500101000	符瑞渊	23	男	理科六班	NaN	符瑞渊男

还可以直接对数值型列进行操作,比如:

book_df["bbb"] = book_df.age/3
book_df	#新建一个"bbb"列,将age列中的数值除3,放进新列
--------------------------
		ID		name  age gender clazz	 ok		aaa		bbb
0	1500100001	施笑槐	22	女	文科六班	0.0	施笑槐女	7.333333
1	1500100002	吕金鹏	24	男	文科六班	1.0	吕金鹏男	8.000000
2	1500100003	单乐蕊	22	女	理科六班	2.0	单乐蕊女	7.333333
3	1500100004	葛德曜	24	男	理科三班	3.0	葛德曜男	8.000000
4	1500100005	宣谷芹	22	女	理科五班	4.0	宣谷芹女	7.333333
...	...	...	...	...	...	...	...	...
995	1500100996	厉运凡	24	男	文科三班	NaN	厉运凡男	8.000000
996	1500100997	陶敬曦	21	男	理科六班	NaN	陶敬曦男	7.000000
997	1500100998	容昆宇	22	男	理科四班	NaN	容昆宇男	7.333333
998	1500100999	钟绮晴	23	女	文科五班	NaN	钟绮晴女	7.666667
999	1500101000	符瑞渊	23	男	理科六班	NaN	符瑞渊男	7.666667

删除列

格式:

df.drop(
index / columns =准备删除的行/列标签,多个时用列表形式提供
inplace = False :是否直接更改原数据框 )
#删一列

book_df.drop(columns='aaa',inplace=True)
book_df
------------------
		ID		name age gender	clazz	  ok	bbb
0	1500100001	施笑槐	22	女	文科六班	0.0	7.333333
1	1500100002	吕金鹏	24	男	文科六班	1.0	8.000000
2	1500100003	单乐蕊	22	女	理科六班	2.0	7.333333
3	1500100004	葛德曜	24	男	理科三班	3.0	8.000000
4	1500100005	宣谷芹	22	女	理科五班	4.0	7.333333
...	...	...	...	...	...	...	...
995	1500100996	厉运凡	24	男	文科三班	NaN	8.000000
996	1500100997	陶敬曦	21	男	理科六班	NaN	7.000000
997	1500100998	容昆宇	22	男	理科四班	NaN	7.333333
998	1500100999	钟绮晴	23	女	文科五班	NaN	7.666667
999	1500101000	符瑞渊	23	男	理科六班	NaN	7.666667
#删多列
book_df.drop(columns=['ok','bbb'],inplace=True)
book_df		#列表形式输入打算删除的列
--------------------------------------------
		ID	    name age gender	clazz
0	1500100001	施笑槐	22	女	文科六班
1	1500100002	吕金鹏	24	男	文科六班
2	1500100003	单乐蕊	22	女	理科六班
3	1500100004	葛德曜	24	男	理科三班
4	1500100005	宣谷芹	22	女	理科五班
...	...	...	...	...	...
995	1500100996	厉运凡	24	男	文科三班
996	1500100997	陶敬曦	21	男	理科六班
997	1500100998	容昆宇	22	男	理科四班
998	1500100999	钟绮晴	23	女	文科五班
999	1500101000	符瑞渊	23	男	理科六班

总结

本篇介绍了:

  1. 如何创建pandas对象结构
  2. pandas中的一些常用数据处理方法

还有一部分常用方法,我们下期介绍哦!

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值