欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

pandas数据类型和对数据和文件处理应用

程序员文章站 2022-03-20 18:05:35
...

引言

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对于数据的运算又十分强大,故一般两者结合使用。