文章目录
Pandas
Pandas 是 Python 中一个非常强大的数据处理库,它提供了快速、灵活和表达式丰富的数据结构,旨在使“关系”或“标签”数据的处理工作变得既简单又直观。Pandas 非常适合于数据清洗和准备阶段,以便进行进一步的分析和建模。
主要数据结构
- Series:一维的、大小可变的、潜在异构的、索引化的数组类型。它可以被看作是一个定长的有序字典(每个元素都有一个标签,即索引)。
- 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 男 理科六班
总结
本篇介绍了:
- 如何创建pandas对象结构
- pandas中的一些常用数据处理方法
还有一部分常用方法,我们下期介绍哦!