Pandas-快速上手

271 阅读9分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

Pandas-快速上手

Series对象

Series是具有索引的一维矢量

import pandas as pd
a=pd.Series(['a','b','c','d','e'],index=[1,2,3,4,5])
print(a)
print(a.index)
print(a.values)

image-20211117092936539

index是索引对象,用于保存标签信息

不设置index,Pandas会自动创建表示位置下标的索引

values是保存元素值的数组

不设置index的情况

import pandas as pd
a=pd.Series(['a','b','c','d','e'])
print(a)
print(a.index)
print(a.values)

image-20211117093138274

读值

import pandas as pd
a=pd.Series(['a','b','c','d','e'],index=['1','2','3','4','5'])
print(a)
# 通过位置
print(a[1])
# 通过标签
print(a['2'])

image-20211117093618599

注意如果设置数字标签会和位置下标冲突

DataFrame

行和列具有标签的表格

通过字典创建DataFrame

import pandas as pd
a=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]},index=['1','2','3'])
print(a)

image-20211117095140494

不设置index

import pandas as pd
a=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})
print(a)

image-20211117095240703

通过数组创建DataFrame

import pandas as pd
import numpy as np
s=np.random.rand(4,3)
print(s)
a=pd.DataFrame(s,columns=['1','2','3'])
print(a)

image-20211117095615529

通过元组创建DataFrame

import pandas as pd
a=pd.DataFrame([('a',1,2),('b',1,2)],columns=['a','b','c'])
print(a)

image-20211117101911892

通过DataFrame构建新的DataFrame

import pandas as pd
data={'a':[1,2,3],'b':[4,5,6]}
a=pd.DataFrame(data)
b=pd.DataFrame(a,index=[2,1,0],columns=['b','a'])
print(a)
print(b)

image-20211117102537094

查询数据

通过标签索引查询数据

import pandas as pd
data={'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]}
a=pd.DataFrame(data)
print(a['c'])
print(a[['a','b']])

image-20211117104046999

显示索引名称

显示列名称

import pandas as pd
data={'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]}
a=pd.DataFrame(data)
print(a)
# 显示索引名称
print(a.index)
# 显示列名称
print(a.columns)

image-20211117105129807

选取数据

[]操作

单列选取或多列选取

import pandas as pd
data={'name':['小a','小b','小c'],'age':[20,21,19],'city':['北京','上海','广州']}
a=pd.DataFrame(data)
print(a)
print('----------------')
print(a['name'])
print(a[['name','city']])

image-20211117105606418

切片

下标切片

import pandas as pd
data={'name':['小a','小b','小c'],'age':[20,21,19],'city':['北京','上海','广州']}
a=pd.DataFrame(data)
print(a)
print('----------------')
print(a[0:2])

image-20211117105945145

标签切片

import pandas as pd
data={'name':['小a','小b','小c'],'age':[20,21,19],'city':['北京','上海','广州']}
a=pd.DataFrame(data,index=['a','b','c'])
print(a)
print('----------------')
print(a['a':'b'])

image-20211117110341014

下标切片选取行数据包括开始值但不包括结束值。

标签切片选取行数据包括开始值和结束值。

条件

import pandas as pd
data={'name':['小a','小b','小c'],'age':[20,21,19],'city':['北京','上海','广州']}
a=pd.DataFrame(data,index=['a','b','c'])
print(a)
print('----------------')
print(a[a.age>19])

image-20211117110609579

loc[]与iloc[]

loc[]是基于标签下标

iloc[]是基于整数下标

单行

import pandas as pd
data={'name':['小a','小b','小c'],'age':[20,21,19],'city':['北京','上海','广州']}
a=pd.DataFrame(data,index=['a','b','c'])
print(a)
print('----------------')
print(a.loc['a'])
print('----------------')
print(a.iloc[0])

image-20211117110928975

多行或多列或某行某列

import pandas as pd
data={'name':['小a','小b','小c'],'age':[20,21,19],'city':['北京','上海','广州']}
a=pd.DataFrame(data,index=['a','b','c'])
print(a)
print('----------------')
print(a.loc[['a','b']])
print('----------------')
print(a.iloc[[0,1]])
print('----------------')
print(a.loc[:,['name','age']])
print('----------------')
print(a.iloc[:,[0,1]])

image-20211117111127805

import pandas as pd
data={'name':['小a','小b','小c'],'age':[20,21,19],'city':['北京','上海','广州']}
a=pd.DataFrame(data,index=['a','b','c'])
print(a)
print('----------------')
print(a.loc[['a','b'],['name','age']])
print('----------------')
print(a.iloc[[0,1],[0,1]])

image-20211117111234006

单个值

at[]与iat[]

标签下标与整数下标

import pandas as pd
data={'name':['小a','小b','小c'],'age':[20,21,19],'city':['北京','上海','广州']}
a=pd.DataFrame(data,index=['a','b','c'])
print(a)
print('----------------')
print(a.at['a','name'])
print('----------------')
print(a.iat[0,0])

image-20211117111450623

常用方法

head()返回前几行数据

import pandas as pd
import numpy as np
a=pd.DataFrame(np.random.rand(4,2),columns=['a','b'])
print(a)
print('-------------------------')
print(a.head(2))

image-20211117135618026

tail()返回后几行数据

import pandas as pd
import numpy as np
a=pd.DataFrame(np.random.rand(4,2),columns=['a','b'])
print(a)
print('-------------------------')
print(a.tail(2))

image-20211117135728168

info()查看索引、数据类型、内存信息

import pandas as pd
import numpy as np
a=pd.DataFrame(np.random.rand(4,2),columns=['a','b'])
print(a)
print('-------------------------')
print(a.info())

image-20211117135955657

describe() 查看数值型列的汇总统计

import pandas as pd
import numpy as np
a=pd.DataFrame(np.random.rand(4,2),columns=['a','b'])
print(a)
print('-------------------------')
print(a.describe())

image-20211117140102031

数值运算方法

未指定轴,则默认轴axis=0

sum() 求和

import pandas as pd
import numpy as np
a=pd.DataFrame(np.random.rand(4,2),columns=['a','b'])
print(a)
print('-------------------------')
print(a.sum())
print('-------------------------')
print(a.sum(axis=1))

image-20211117140554778

mean() 求平均值

import pandas as pd
import numpy as np
a=pd.DataFrame(np.random.rand(4,2),columns=['a','b'])
print(a)
print('-------------------------')
print(a.mean())
print('-------------------------')
print(a.mean(axis=1))

image-20211117140715565

min() 求最小值

import pandas as pd
import numpy as np
a=pd.DataFrame(np.random.rand(4,2),columns=['a','b'])
print(a)
print('-------------------------')
print(a.min())
print('-------------------------')
print(a.min(axis=1))

image-20211117140821845

max() 求最大值

import pandas as pd
import numpy as np
a=pd.DataFrame(np.random.rand(4,2),columns=['a','b'])
print(a)
print('-------------------------')
print(a.max())
print('-------------------------')
print(a.max(axis=1))

image-20211117140908779

std() 求标准差

import pandas as pd
import numpy as np
a=pd.DataFrame(np.random.rand(4,2),columns=['a','b'])
print(a)
print('-------------------------')
print(a.std())
print('-------------------------')
print(a.std(axis=1))

image-20211117141012727

abs() 求所有值的绝对值

abs函数取绝对值是对每个元素进行的操作, 不可指定axis参数。

import pandas as pd
import numpy as np
a=pd.DataFrame(np.random.randn(4,2),columns=['a','b'])
print(a)
print('-------------------------')
print(a.abs())

image-20211117141345296

cumsum() 求累计总和

import pandas as pd
import numpy as np
a=pd.DataFrame(np.random.rand(4,2),columns=['a','b'])
print(a)
print('-------------------------')
print(a.cumsum())
print('-------------------------')
print(a.cumsum(axis=1))

image-20211117141251765

处理文本字符串

strip() 删除两侧空格

import pandas as pd
a=pd.Series([' 123-5469-7896','456-7896-1234 '])
b=a.str.strip()
print(a)
print('---------------------')
print(b)

image-20211117143643086

split()指定某值对字符串进行分割 返回列表

import pandas as pd
a=pd.Series([' 123-5469-7896','456-7896-1234 '])
b=a.str.strip()
c=b.str.split('-')
print(a)
print('---------------------')
print(c)

image-20211117143759828

join() 指定某字符串连接每个列表元素

import pandas as pd
a=pd.Series([' 123-5469-7896','456-7896-1234 '])
b=a.str.strip()
c=b.str.split('-')
d=c.str.join('~')
print(a)
print('---------------------')
print(d)

image-20211117143903478

replace(a,b) 将字符串的a替换成b

import pandas as pd
a=pd.Series([' 123-5469-7896','456-7896-1234 '])
b=a.str.strip()
c=b.str.split('-')
d=c.str.join('~')
e=d.str.replace('~','-')
print(a)
print('---------------------')
print(e)

image-20211117143950041

contains() 判断字符串是否包含某值

import pandas as pd
a=pd.Series([' 123-5469-7896','456-7896-1234 '])
print(a.str.contains('-'))
print('---------------------')
print(a.str.contains('a'))

image-20211117144103024

isnumeric() 判断字符串所有字符是否为数字

import pandas as pd
a=pd.Series([' 123-5469-7896','abc-asdf-qwer '])
b=a.str.strip()
c=b.str.replace('-','')
print(c)
print('----------------------')
print(c.str.isnumeric())

image-20211117144318742

合并与连接

merge( ) 合并

left:进行合并的左侧DataFrame。

right:进行合并的右侧DataFrame。

on:两个DataFrame进行合并关联的条件列必须同时存在于左侧和右侧DataFrame对象中。如果未传递且left_index和right_index为False,则DataFrame中列的交集将被认为是关联列。

left_on:选取左侧DataFrame中作为关联条件的列。

right_on:选取右侧DataFrame中作为关联条件的列。

how:参数可选left、right、outer和inner,默认为inner。inner是取两个DataFrame的交集,outer是取两DataFrame的并集。left是以左表为基表进行合并,right是以右表为基表进行合并。

import pandas as pd
a=pd.DataFrame({'学号':[1,2,3,4,5],'姓名':['A','B','C','D','E'],
                '年龄':[19,20,21,22,18]})
b=pd.DataFrame({'学号':[1,2,3,4,6],'班级':['01','02','03','04','05']})
print(a)
print('-------------------')
print(b)
print('-------------------')
print(pd.merge(a,b,on=['学号'],how='left'))
print('-------------------')
print(pd.merge(a,b,left_on=['学号'],right_on=['学号'],how='left'))

image-20211117150954087

left、right 对比

left以左表作为基准表进行合并

right 以右表作为基准表进行合并

import pandas as pd
a=pd.DataFrame({'学号':[1,2,3,4,5],'姓名':['A','B','C','D','E'],
                '年龄':[19,20,21,22,18]})
b=pd.DataFrame({'学号':[1,2,3,4,6],'班级':['01','02','03','04','05']})
print(a)
print('-------------------')
print(b)
print('-------------------')
print(pd.merge(a,b,on=['学号'],how='left'))
print('-------------------')
print(pd.merge(a,b,on=['学号'],how='right'))

image-20211117151246236

outer、inner对比

outer找不到与其对应的关联条件列,则相应列下补充NaN

inner左右两表关联条件列同时存在的数据

import pandas as pd
a=pd.DataFrame({'学号':[1,2,3,4,5],'姓名':['A','B','C','D','E'],
                '年龄':[19,20,21,22,18]})
b=pd.DataFrame({'学号':[1,2,3,4,6],'班级':['01','02','03','04','05']})
print(a)
print('-------------------')
print(b)
print('-------------------')
print(pd.merge(a,b,on=['学号'],how='outer'))
print('-------------------')
print(pd.merge(a,b,on=['学号'],how='inner'))

image-20211117151355140

concat( ) 连接

objs:需要连接的对象,通常为list

axis:进行连接的方向

import pandas as pd
a=pd.DataFrame({'学号':[1,2,3,4,5],'姓名':['A','B','C','D','E'],
                '年龄':[19,20,21,22,18]})

b=pd.DataFrame({'学号':[1,2,3,4,6],'班级':['01','02','03','04','05']})

c=pd.DataFrame({'学号':[5,6],'姓名':['F','G'],
                '年龄':[20,22]})
print(a)
print('-------------------')
print(b)
print('-------------------')
print(pd.concat([a,c]))
print('-------------------')
print(pd.concat([a,b],axis=1))

image-20211117152016550

操作应用方法

去重操作

drop_duplicates( )

inplcae:{True,False},默认为False。表示是否直接在原数据上删除重复项或删除重复项后返回副本。False表示不在原数据上删除重复项,而是返回一个删除重复项的副本。

keep:{first,last,False},默认值为first。表示保留重复行中的哪些行,删除重复行中的哪些行。当为first时,表示保留重复行中第一行,后面的重复行进行删除;当为last时,表示保留重复行中最后一行,前面的重复行进行删除;当为False时,表示将重复行都删除,不保留任意一行。若没有指定keep,则默认为first。

subset:列名,可选,默认为None。

import pandas as pd
a=pd.DataFrame({'学号':[1,2,3,4,5,5],'姓名':['A','B','C','D','E','E'],
                '年龄':[19,20,21,22,18,18]})
print(a)
print('------------------------')
b=a.drop_duplicates(inplace=False)
print(b)

image-20211117152802029

指定列

只判断学号是否相同不考虑其他

import pandas as pd
a=pd.DataFrame({'学号':[1,2,3,4,5,5],'姓名':['A','B','C','D','E','H'],
                '年龄':[19,20,21,22,18,18]})
print(a)
print('------------------------')
b=a.drop_duplicates(subset=['学号'],keep='first',inplace=False)
print(b)

image-20211117153055022

自动遍历

apply( )

import pandas as pd
a=pd.DataFrame({'学号':[1,2,3,4,5,5],'姓名':['A','B','C','D','E','H'],
                '年龄':[19,20,21,22,18,18]})

print(a['姓名'].apply(lambda x: '姓名:'+x))

image-20211117153514358

通常在apply( )函数里使用lambda表达式,代码中的x指的是df4 [ '评分' ]中的每一行元素,会对每一行元素执行相同的操作

排序

sort_values( )

by:指定要排序的列名或索引值。

ascending:{True,False},默认为True,指定排序的方式,True代表升序。

inplcae:{True,False},默认为False。表示是否直接在原数据上删除重复项或删除重复项后返回副本。

import pandas as pd
a=pd.DataFrame({'学号':[1,2,3,4,5,5],'姓名':['A','B','C','D','E','H'],
                '年龄':[19,20,21,22,18,18]})
a.sort_values(by='年龄',ascending=False,inplace=True)
print(a)

image-20211117154002689

重新设置行索引

reset_index( )

import pandas as pd
a=pd.DataFrame({'学号':[1,2,3,4,5,5],'姓名':['A','B','C','D','E','H'],
                '年龄':[19,20,21,22,18,18]})
a.sort_values(by='年龄',ascending=False,inplace=True)
a=a.reset_index()
print(a)

image-20211117154158030

删除

drop( )

import pandas as pd
a=pd.DataFrame({'学号':[1,2,3,4,5,5],'姓名':['A','B','C','D','E','H'],
                '年龄':[19,20,21,22,18,18]})
print(a)
print('--------------------')
print(a.drop(0))
print('--------------------')
print(a.drop('年龄',axis=1))

image-20211117154451100

修改列名

rename( )

字典中的key与value对应要改的列名和改后的列名,指定轴axis=1

import pandas as pd
a=pd.DataFrame({'学号':[1,2,3,4,5,5],'姓名':['A','B','C','D','E','H'],
                '年龄':[19,20,21,22,18,18]})
print(a)
print('-------------------')
a.rename({'学号':'classID','姓名':'name','年龄':'age'},inplace=True,axis=1)
print(a)

image-20211117154819542