Pandas简介
Pandas 是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。Pandas最初被作为金融数据分析工具而开发出来,因此,pandas为时间序列分析提供了很好的支持。Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。
Pandas数据读取
代码实现!
import pandas as pd
import xlwt
import random
def r_csv():
print('pandas读取csv文件')
txt=pd.read_csv('text2.csv')
print('查看前几行数据')
print(txt.head())
print('查看数据的形状,返回行数和列数')
print(txt.shape)
print('查看列名列表')
print(txt.columns)
print('查看索引列')
print(txt.index)
print('查看每列的数据类型')
print(txt.dtypes)
print('\n'*5)
def r_txt():
p=pd.read_csv(
fpath='text1.txt',
sep='\t', #指定分割符
header=None, #没有数据头
names=['pdate','pv','uv'] #自己制定列名
)
def r_excel():
txt=pd.read_excel('ta.xls')
print(txt)
def r_mysql():
import pymysql
con=pymysql.connect(
host='127.0.0.1',
user='root',
password='123456789',
database='pro203',
charset='utf8'
)
txt=pd.read_sql("select * from employee",con=con)
print(txt)
if __name__ == '__main__':
r_csv()
r_excel()
Pandas数据结构
-
Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
-
Time- Series:以时间为索引的Series。
-
DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。
-
Panel :三维的数组,可以理解为DataFrame的容器。
-
Panel4D:是像Panel一样的4维数据容器。
-
PanelND:拥有factory集合,可以创建像Panel4D一样N维命名容器的模块。
-
DataFrame:是一个表格型的数据结构。首先每列可以是不同的值类型(数值,字符串,布尔值等)。其次既有行索引也有列索引。并且它还可以被看作由Series组成的字典。创建dataframe的方式常见的有从纯文本文件,excel,mysql中读取。
-
Series:是一种类似于一维数组的对象,它由一组数据(不同的数据类型)以及一组与之相关的数据标签(索引)组成。
代码实现!
import pandas as pd
class Series:
def way1(self):
print('仅有数据列表即可产生最简单的Series')
s1=pd.Series([1,'a','sfr',9])
print("左侧为索引,右侧为数据")
print(s1)
print('获取索引')
print(s1.index)
print('获取数据')
print(s1.values)
def way2(self):
print('创建一个具有标签索引的Series')
s2=pd.Series([1,'a','sfr',9],index=['a','b','c','d'])
print(s2)
print(s2['c'])
def way3(self):
print('使用python字典创建Series')
data={'a1':2020,'a2':229,'a3':1994,'a4':120}
s3=pd.Series(data)
print(s3)
print(s3['a1'])
class Dataframe:
def creat(self):
print('根据多个字典序列创建dataframe')
data={
'state':['a1','a2','a3','a4'],
'year':[i for i in range(2000,2004)],
'pop':[9,8,7,4]
}
df=pd.DataFrame(data)
print(df)
print('查看每列的类型')
print(df.dtypes)
print('查看列索引和行索引')
print(df.columns)
print(df.index)
print('=='*20)
print('从DataFrame中查询Series','\n','如果只查询一列则返回的是pd.Series','\n','如果查询的是多行,多列则返回的是pd.DataFrame')
print('=='*20)
print('一列')
print(df['year'])
print(type(df['year']))
print('查询多行')
print(df[['year','pop']])
print('查询一行')
print(df.loc[1])
print(type(df.loc[1]))
print('查询多行')
print(df.loc[1:3])
print(type(df.loc[1:3]))
print('=='*20)
print('=='*20)
a=Series
print(a.way1(1))
print(a.way2(1))
print(a.way3(1))
b=Dataframe
print(b.creat(1))
Pandas查询数据
Pandas查询数据的几种方法。
- df.loc方法,根据行列标签值查询。
- df.iloc方法,根据行,列位置查询。
- df.where方法。
- df.query方法。
df.loc方法查询数据
- 使用单个label值查询数据。
- 使用值列表批量查询。
- 使用数值区间进行范围查询。
- 使用条件表达式查询。
- 调用函数查询。
注意:
-
以上查询方法适用于列行。
-
降维。DataFrame->Series->值。
代码实现!
import pandas as pd
def read():
df=pd.read_csv('tian.csv')
print(df.head())
print('设置索引为日期,方便按日期筛选')
df.set_index('ymd',inplace=True)
print(df.index)
print(df.head())
print('替换温度的后缀')
df.loc[:,'bWendu']=df['bWendu'].str.replace("℃",'').astype('int32')
df.loc[:,'yWendu']=df['yWendu'].str.replace("℃",'').astype('int32')
print(df.dtypes)
print(df.head())
print('使用单个label值查询数据')
print('得到单个值->',df.loc['2018-05-25','bWendu'])
print('得到一个Series->',df.loc['2018-04-01',['bWendu','yWendu']])
print('使用值列表批量查询')
print('得到一个Series->',df.loc[['2018-01-03','2018-01-04','2018-01-05'],'bWendu'])
print('得到一个DataFrame->',df.loc[['2018-01-03','2018-01-04','2018-01-05'],['bWendu','yWendu']])
print('使用数值区间进行范围查询(注意:包含开始和结束)')
print('行index按区间->',df.loc['2018-01-04':'2018-01-14','bWendu'])
print('列index按区间->',df.loc['2018-01-04','bWendu':'aqiInfo'])
print('列和行都按区间查询->',df.loc['2018-01-04':'2018-01-14','bWendu':'aqiInfo'])
print('使用条件表达式查询')
print('bool列表的长度得等于行数或者列数')
print('简单条件查询,最低温度低于-10度的列表->',df.loc[df['yWendu']<-10,:])
print('观察一下booleam条件',df['yWendu']<-10)
print('复杂条件查询')
print('查询最高温度小于30度最低温度大于15度,并且是晴天,天气为优的数据')
print(df.loc[(df["bWendu"]<=30)&(df["yWendu"]>=15)&(df["aqiLevel"]==1),:])
print('再次观察复杂条件',(df["bWendu"]<=30)&(df["yWendu"]>=15)&(df["aqiLevel"]==1))
print('调用函数查询')
print('使用lambda表达式->',df.loc[lambda df:(df["bWendu"]<=30) & (df['yWendu']>=15),:])
print('通过自定义函数查询')
def query_my_data(df):
return df.index.str.startswith('2018-09')&df["aqiLevel"]==1
print(df.loc[query_my_data(df),:])
read()
反思总结
通过这一部分的学习,我体会到了pandas的强大。有人说pandas像是一个数据库,还有人说pandas是一个类似于Excel的但是功能不局限于Excel,对于这两张方法我都赞同。我的感觉是pandas功能强大,简单易用。
之前我认为pandas是数据分析的三大利器之一,但是现在我认为学会了pandas对自己学习其他的领域的知识有着很大的助力。学会了pandas就相当于将自己的水平提升了一个等级。