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')#读取指定表格

在实际操作中遇到的一些功能

#描述数据情况
pd.describe()
#去除某一行/列
pd.drop(['Name'],axis=1/0) #0表示行匹配,1表示列匹配
#求众数
pd.mode()
#缺失值相关函数
dropna:删除缺失值
fillna: 用某些值填充缺失的数据或使用插值方法(比如ffill\bfill)
isnull:判断哪些值是缺失值,返回布尔
notnull:isnull的反函数

总结

pandas 虽然是基于numpy,但读文件的速度却比numpy快的多,而numpy对于数据的运算又十分强大,故一般两者结合使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值