pandas数据类型和对数据和文件处理应用
引言
pandas对numpy对文件的处理更加方便,也更加快速。这里对pandas的一些基础的使用方法进行介绍。
安装pandas
windows系统 命令行输入pip install pandas
mac系统 命令行输入pip3 install pandas
anaconda 环境下直接导入即可
导入pandas
一般导入pandas时对数据处理的时候也需要导入numpy
import pandas as pd
import numpy as np
pandas的数据结构
1,Series型数据
Series型是一维的数据,基本上就是一列,相当于一个比较长的字典。
下面介绍Series型数据的基本使用方法。
(1)根据index创建series
当index不给出的时候,series默认从0-N来建立索引,
data=pd.Series([1,3,5,7])
print(data)
左边为索引,右侧为值
0 1
1 3
2 5
3 7
当然,也可以自定义索引
data = pd.Series([1,3,5,7],index=['A','B','C','D'])
print(data)
这里注意,当索引的长度与数据的长度不匹配时,会报错,这里可以自己尝试以下。
(2)根据字典创建Series型数据
Series就相当于一个定长的字典,所以我们也可以将一个字典转化为一个Series型的数据。
data1={"Beijing":10000,"Shanghai":12000,"Shenzhen":10000}
data = pd.Series(data1)
print(data)
Beijing 10000
Shanghai 12000
Shenzhen 10000
字典中的元素索引与数据是一一对应的,如果转化重新设置索引转化为Series的时候,出现了新的索引,系统自动显示NaN。
data1={"Beijing":10000,"Shanghai":12000,"Shenzhen":10000}
index1 = ['Beijing','Guangzhou']
data = pd.Series(data1,index=index1)
print(data)
Beijing 10000.0
Guangzhou NaN
(3)获取Series中的数据
获取Series中的数据大部分都和获取字典中的数据差不多,但是Series中获取数据更为强大。
data1={"Beijing":10000,"Shanghai":12000,"Shenzhen":10000}
index1 = ['Beijing','Guangzhou','Shanghai','Shenzhen']
data = pd.Series(data1,index=index1)
print(data['Beijing'])#直接访问单个元素
print(data[['Beijing','Shanghai']])#直接访问多个元素
print(data['Beijing':'Shenzhen'])#切片访问多个元素
print(data.index)#输出index
print(data.value_counts())#输出每一个数据出现的次数
print(data.values)#输出所有的数据
print(data.head(3))#输出头三行
print(data.tail(3))#输出尾三行
print(data.isnull())#判断是否为空
10000.0
Beijing 10000.0
Shanghai 12000.0
dtype: float64
Beijing 10000.0
Guangzhou NaN
Shanghai 12000.0
Shenzhen 10000.0
dtype: float64
Index(['Beijing', 'Guangzhou', 'Shanghai', 'Shenzhen'], dtype='object')
10000.0 2
12000.0 1
dtype: int64
[10000. nan 12000. 10000.]
Beijing 10000.0
Guangzhou NaN
Shanghai 12000.0
dtype: float64
Guangzhou NaN
Shanghai 12000.0
Shenzhen 10000.0
dtype: float64
Beijing False
Guangzhou True
Shanghai False
Shenzhen False
dtype: bool
2,DataFrame型数据
DataFrame是个多行多列的数据类型,比Series更加复杂,对于数据处理功能也更加普遍化。
(1)创建一个DataFrame型数据
dic_data={
'student':['张三','李四','王五'],
'score':['100','90',' 95'],
'gender':['M','F','M']
}
data=pd.DataFrame(dic_data,columns=['gender','student','score'])
#columns是规定列的排列指标,如果没有,则按原始的顺序。
print(data)
结果如下:
student score gender
0 张三 100 M
1 李四 90 F
2 王五 95 M
这里面任何一列单独列出来都是一个Series,同样的,在创建DataFrame的时候,也可以自定义它的索引。
(2)获取DataFrame中的有关数据
dic_data={
'student':['张三','李四','王五'],
'score':['100','90',' 95'],
'gender':['M','F','M']
}
data=pd.DataFrame(dic_data,index=['a','b','c'])
print(data.iloc[0])#按照数字索引输出行
print(data.loc['a':'b'])#按照名称索引输出行
print(data['score'])#输出列
print(data.['score'].loc['a'])#输出某列某行的数据
#第一个输出结果:
student 张三
score 100
gender M
#第二个输出结果:
student score gender
a 张三 100 M
b 李四 90 F
#第三个输出结果
a 100
b 90
c 95
#第四个输出
100
(3数据的增加与修改
重置数据的索引,注意到如果和原来的索引一样,则数据顺序也会改变,如果不一样则重新分配索引。
data=data.reindex(['c','b','a'])
print(data)
结果如下
student score gender
c 王五 95 M
b 李四 90 F
a 张三 100 M
如果增加的索引,要引入插值的方法如下:
dic_data={
'student':['张三','李四','王五'],
'score':['100','90',' 95'],
'gender':['M','F','M']
}
data=pd.DataFrame(dic_data,index=['a','b','c'])
data=data.reindex(['c','b','a','d'],method='ffill')
#ffill是从前面的数据插入值,还可以bfill从后面的数据插入值
data=data.reindex(['c','b','a','d'],fill_value=0)
#插入默认为0的值
print(data)
结果如下:
student score gender
c 王五 95 M
b 李四 90 F
a 张三 100 M
d 王五 95 M
student score gender
c 王五 95 M
b 李四 90 F
a 张三 100 M
d 0 0 0
(4)数据中空元素的处理
有时候有些数据中含有一些空的元素,我们既可以采用如上的方法进行填充,也可以删除
print(data.dropna())#扔掉包含缺失数据的行
print(data.dropna(how='all'))#扔掉全部数据都缺失的行
print(data.fillna(0)))#填充所有空的数据使其为0
print(data.fillna({'students':'unkown','score':'0','gender':'unkown'})#按指定方式填充
del data['score']#删除某一列
data.drop('a')#删除某一行
数据处理的方法
1,数据的筛选
有时候我们需要根据数据的特征筛选出我们所需要的数据,比如这里的成绩,查看60分以下的人。
dic_data={
'student':['张三','李四','王五'],
'score':[100,50, 95],
'gender':['M','F','M']
}
data=pd.DataFrame(dic_data)
print(data[data['score']<60])#根据范围筛选数据
结果如下
student score gender
1 李四 50 F
或者我不需要选择小于60分的,我需要的是100分,95分的人
dic_data={
'student':['张三','李四','王五'],
'score':[100,50, 95],
'gender':['M','F','M']
}
data=pd.DataFrame(dic_data)
seclist=np.array([100,95])
print(data[data['score'].isin(seclist)])#从列表中筛选数据
结果如下:
student score gender
0 张三 100 M
2 王五 95 M
2,利用groupby对重复数据分组进行sum和mean运算
data2={
'id':['a','a','b','a','b','c'],
'counts':[60,70,50,90,110,100]
}
data = pd.DataFrame(data2)
groupdata=data.groupby('id')#根据id进行分组
print(groupdata.sum())#输出每组id数字的和
结果如下:
counts
id
a 220
b 160
c 100
3,数据的排序
按照索引排序
data.sort_index(ascending=False)#索引降序
data.sort_index(ascending=True)#索引升序
data.sort_index()#索引升序
按照value排序,其中升序降序和索引一样加个参数就可
data.sort_values(by='score')
还有一些其他的统计方法可以参考numpy:
https://blog.csdn.net/m0_46260305/article/details/106638945
4, 两个DataFrame合并
data1=pd.DataFrame({
'key':['a','a','b','b','c','d'],
'value1':[1,2,3,4,5,6]
})
data2=pd.DataFrame({
'key':['a','b','c'],
'value2':[7,8,9]
})
data=pd.merge(data1,data2,how='outer')
#按公共部分,还可以按照left和right的key来排。
print(data)
这是两个属性中的都是key,若不一样
data = pd.merge(data1,data2,left_on='lkey',right_on='rkey')
pandas文件的读取
1,读取csv文件,不用标题行
data=pd.read_csv('read.csv',header=None,sep=',')#若不读第一行即标题行则加header,sep为读取的分格符号
print(data)
指定标题行的名称
data=pd.read_csv('read.csv',
name=['userid','bookid','counts'],
index_col='userid')
#自定义列名称,并且将索引定为userid
当读取CSV文件后有数据缺失,pd自动补为NaN
2,储存csv文件
data.to_csv('read.csv')
3,读取excel文件
首先需要安装一个模块:xlrd
windows:pip install xlrd
mac: pip3 install xlrd
file=pd.Excelfile('student.xlsx')#读取指定文件
data = file.parse('student')#读取指定表格
总结
pandas 虽然是基于numpy,但读文件的速度却比numpy快的多,而numpy对于数据的运算又十分强大,故一般两者结合使用。
推荐阅读
-
使用NumPy和pandas对CSV文件进行写操作的实例
-
SQLSERVER 2005中使用sql语句对xml文件和其数据的进行操作(很全面)
-
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
-
Redis的使用--基本数据类型的操作命令和应用场景
-
对pandas中两种数据类型Series和DataFrame的区别详解
-
C语言基础篇-数据类型(一)gcc编译和预处理
-
python处理csv文件和excel文件读取数据详解(xlrd/xlwt及openpyxl分析)
-
SQLSERVER 2005中使用sql语句对xml文件和其数据的进行操作(很全
-
Oracle数据文件转移和丢失处理
-
利用numpy和pandas处理csv文件中的时间方法