目录
pandas中主要有两种数据结构,分别是:Series和DataFrame。
Series:一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。注意:Series中的索引值是可以重复的。
DataFrame:一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。
引入模块
import pandas as pd
一、Series
创建Series
使用列表创建Series,如果不指定索引,会自动创建数值型索引,从0开始
pd.Series([1,2,3])
使用字典创建Series,会把字典的key当作Series索引
属性
ser.dtype 查看数据类型,如果未指定索引,默认使用RangeIndex
ser.index 查看索引
ser.index.dtype 查看索引的数据类型
ser.values 获取值,类型是ndarray
使用index参数设置索引,dtype设置数据类型
ser=pd.Series([1,2,3],index=['key1','key2','key3'],dtype='uint8')
Name属性
ser.name="班级总人数" #设置Series列表名
ser.index.name="班级" #设置索引名
axes 类似于index,只是返回列表类型
empty 如果Series为空,返回True
ndim 返回维度数
size 返回大小
方法
head(n) 返回前n行
tail(n) 返回最后n行
Series值的获取
1、使用索引取值
ser['key1']
2、使用下标取值
ser[0]
切片
使用索引切片,会包含两边的值,闭合区间
ser['key1':'key5']
下标切片,不包含末尾的值
ser[1:5]
花式索引
【】里面再套一个【】
ser[['key1','key3']],获取索引是key1和key3的行数据
ser[[1,3,4]] # 通过下标取第2、4、5行数据
如果有相同的索引值
1、通过同名索引取值会取到多个值
2、无法通过不唯一的索引切片
Series的运算
numpy中的数组运算方法都保留到Series中了,可以使用numpy的任意运算方法。
运算的时候会自动对齐key值
如果一个有key一个没有的话,运算后会是nan
phone_sales=pd.Series([7250,6050,4150,3700,3200,2800],index=['三星','华为','苹果','OPPO','小米',"VIVO"])
phone_sales.name="2019Q2出货量"
print(phone_sales)
phone_sales_q1=pd.Series([2000,1900,1800,1700,1500],index=['苹果','OPPO','小米','三星','华为'])
print("="*40)
print(phone_sales_q1)
result=phone_sales+phone_sales_q1
result
两个数组相加会根据key自动对齐,VIVO一边有值一边没有值,结果是nan,看输出结果
缺失值处理
isnull() 是否是空值
notnull() 是否是非空
二、DataFrame
列可以是不同的数据类型
大小可变
可对行列执行运算
创建
pd.DataFrame(data,index,columns,dtype)
index 行索引
columns 列索引
dtype 只能同时设置所有列的数据类型,如果想要每一列数据类型设置不同,可以单独给某一列进行设置
1、通过二维列表创建
sales=[
[1,2,3],
[5,6,7],
[2,3,4],
]
df=pd.DataFrame(sales)
df=pd.DataFrame(sales,index=[行索引],columns=[列索引],dtype="int32")
df.info() 查看信息以及占用空间情况
2、通过字典创建DataFrame
pd.DataFrame(dict)
取值
先列后行
df['key1'] 获取key1列
切片
默认是列方向,不能直接对列进行切片。如果要对列切片,请参考下面的loc介绍。
df[2:4]这种写法是错误的,不支持直接的列切片。
花式索引
df[['key2','key4']] 获取其中2个列
df[[2,4]] 获取第2、第4个列
获取行
loc 通过索引
iloc 通过下表
准备数据如下:
roleInfo={
"libai":{"name":"李白",'label':"刺客","sex":"男","money":18888},
"diaochan":{"name":"貂蝉",'label':"法师","sex":"女",'money':13888},
'bajie':{"name":"猪八戒",'label':"坦克",'sex':"猪",'money':18888},
'change':{"name":"嫦娥",'label':"法师",'sex':"仙女",'money':0}
}
df=pd.DataFrame(roleInfo)
df=df.T
df
df.loc['libai'] 通过索引获取行,获取libai那一行数据
df.loc['libai':'bajie'] 行切片,获取libai到bajie三行的数据,包括右边边界索引
df.loc[['libai','diaochan']] 行花式索引,获取libai和diaochan两行数据
获取行和列
中间用逗号隔开[行规则,列规则],如果要保留所有直接用:冒号
df.loc['libai','name'] 获取行李白和列name
df.loc[:,'label':"name"] 列切片
df.loc[['diaochan','change'],['name','money']] #行列花式索引
iloc 使用下标方式取值
df.iloc[0:3] 用下表方式进行切片的时候,不包括右边下标,左闭右开
df.iloc[0:3,0:3] 用下表对行和列切片
修改值
infos.loc['z']=[1,2,3,4] #对一行进行赋值
infos.log['a']=0 #整行一起赋值
infos['C']=100 #整列一起赋值
新增行和列
修改一个不存在的行或列,即为新增
infos['F']=80 新增一列
infos.loc['a']=120 新增一行
删除列和行
列删除
del infos['F'] 删除第F列
pop() 删除某列,并且返回该列的值
infos.pop('D')
行删除
df.drop() 可以删除多行,不会修改原数组,而是在返回的数组中删除了行
infos=infos.drop("a")
infos=infos.drop(["w","y"]) #删除多行
drop也可以删除列,删除多列
infos.drop(['A','B'],axis=1)
或者 infos.drop(['A','B'],axis='columns')