这是我参与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)
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)
读值
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'])
注意如果设置数字标签会和位置下标冲突
DataFrame
行和列具有标签的表格
通过字典创建DataFrame
import pandas as pd
a=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]},index=['1','2','3'])
print(a)
不设置index
import pandas as pd
a=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})
print(a)
通过数组创建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)
通过元组创建DataFrame
import pandas as pd
a=pd.DataFrame([('a',1,2),('b',1,2)],columns=['a','b','c'])
print(a)
通过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)
查询数据
通过标签索引查询数据
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']])
显示索引名称
显示列名称
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)
选取数据
[]操作
单列选取或多列选取
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']])
切片
下标切片
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])
标签切片
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'])
下标切片选取行数据包括开始值但不包括结束值。
标签切片选取行数据包括开始值和结束值。
条件
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])
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])
多行或多列或某行某列
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]])
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]])
单个值
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])
常用方法
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))
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))
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())
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())
数值运算方法
未指定轴,则默认轴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))
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))
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))
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))
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))
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())
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))
处理文本字符串
strip() 删除两侧空格
import pandas as pd
a=pd.Series([' 123-5469-7896','456-7896-1234 '])
b=a.str.strip()
print(a)
print('---------------------')
print(b)
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)
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)
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)
contains() 判断字符串是否包含某值
import pandas as pd
a=pd.Series([' 123-5469-7896','456-7896-1234 '])
print(a.str.contains('-'))
print('---------------------')
print(a.str.contains('a'))
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())
合并与连接
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'))
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'))
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'))
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))
操作应用方法
去重操作
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)
指定列
只判断学号是否相同不考虑其他
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)
自动遍历
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))
通常在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)
重新设置行索引
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)
删除
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))
修改列名
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)