pandas&pandas学习教程&DataFrame与Series数据结构

时间:2022-11-01 15:55:06

安装:
pandas的最小依赖项为:
NumPy,python-dateutil,pytz
安装pandas前需先安装上述三个依赖项。
pandas官网文档强调,pandas项目名称中的字母应该全部采用小写形式,同时导入pandas库应采用import pandas as pd
1.pandas的DataFrame数据结构
DataFrame是一种带标签的二维对象。
创建方式为:

  • 从另一个DataFrame创建DataFrame
  • 从具有二维形状的NumPy数组创建
  • 用pandas的另一种数据结构Series创建
  • 从CSV之类的文件创建
from pandas.io.parsers import read_csv
df = read_csv("hahaha.csv") #从CSV中读取
print("Dataframe",df) #显示内容
print(df.shape) #数据结构的形状
print(len(df)) #长度
print(df.columns) #每一列的标题 df.columns[2]
print(df.dtypes) #每一列的数据类型 df.dtypes[2]
print(df.index) #每一行的索引号
print(df.values) #数据结构的值
print(df.values[4]) #通过索引检索每一行的值

DataFrame的索引可以由pandas自动创建,或是手动规定。
2.pandas的DataFrame数据结构
创建方式为:

  • 由Python字典创建
  • 由NumPy数组创建
  • 由单个标量值创建

创建Series数据结构时,可以向构造函数递交一组轴标签,这些标签通常称为索引,是一个可选参数。通常,如果numpy作为输入数据,那么pandas将索引值从0开始自动递增。如果传递的为python字典,则键值为索引。如果输入的为标量值,则需手动提供索引值。

from pandas.io.parsers import read_csv
df = read_csv("WHO_first9cols.csv") #从CSV中读取
first_col = df[df.columns[0]] #选中DataFrame一列,则为Series型数据
print(first_col.dtypes) #输出类型,numpy的函数同样适用于pandas
print(np.sum(first_col - first_col.values)) #numpy的函数适用于DataFrame与Series
print(first_col.shape) #输出每维的长度
print(first_col.index) #索引
print(first_col.values) #值,索引方式first_col.valuse[4]
print(first_col.name) #该列或者Series数据的名字,第一行
print(first_col[1:4]) #Series具有切片功能

3.利用pandas查询数据
从Quandl检索年度太阳黑子数据。可以安装Quandl程序包:

pip install Quandl

查询函数如下:

import quandl
sunspots = quandl.get('SIDC/SUNSPOTS_A')
print(sunspots.head(2)) #前n条记录
print(sunspots.tail(2)) #后n条记录
last_date = sunspots.index[-1] #取最新一年的索引
print(sunspots.loc[last_date]) #取最新一年的数据
print(sunspots["20020102":"20131231"]) #通过YYYYMMDD格式的日期字符串来查询日期
print(sunspots.iloc[[2,4,-2,-4]]) #索引列表也可以用于查询第24,-2,-4的值,sunspots.iloc[2]
print(sunspots.iloc[0,0]) #通过索引查询标量值,第一个表示行,第二个表示列
print(sunspots.iat[0,0]) #通过索引查询标量值,第一个表示行,第二个表示列,速度更快
print(sunspots[sunspots>sunspots.mean]) #查询布尔型变量的方法,查询所有数据行,与条件不符的行赋予Nan值

4.利用pandas的DataFrame进行统计计算

import quandl
sunspots = quandl.get('SIDC/SUNSPOTS_A')
print(sunspots.describe()) #返回描述性统计信息,例如每行的非Nan数据项数量,mead值,std值,min值,max值,各种位数。
print(sunspots.count()) #返回每行非Nan的数据的数量
print(sunspots.mad()) #每行平均绝对误差,类似于标准差的一个有力的统计工具
print(sunspots.median()) #每行的中位数
print(sunspots.min()) #最小值
print(sunspots.max()) #最大值
print(sunspots.mode()) #返回一个众数,即出现次数最多的数
print(sunspots.std()) #标准差,方差的平方根
print(sunspots.var()) #返回方差
print(sunspots.skew()) #偏态系数,即数据分布的对称程度
print(sunspots.kurt()) #返回数据分布曲线顶端尖峭或扁平程度

5.利用pandas的DataFrame实现数据聚合

import numpy as np
import pandas as pd
data = {'Weather' : ['cold', 'hot', 'cold', 'hot',
'cold', 'hot', 'cold'],
'Food' : ['soup', 'soup', 'icecream', 'chocolate',
'icecream', 'icecream', 'soup'],
'Price' : 10 * np.random.rand(7), 'Number' : np.random.random_integers(1, 9, size=(7,))}
df = pd.DataFrame(data) #根据字典创建DataFrame
weather_group = df.groupby('Weather') #数据聚合,按weather分组
i = 0
for name , group in weather_group: #name为weather的名字,group为该类中的项
i = i + 1
print(i,name)
print(group)
print(weather_group.first()) #输出各组数据的第一行
print(weather_group.last()) #输出各组数据的最后一行
print(weather_group.mean()) #输出各组的平均值

##以两种数据分组
wf_group = df.groupby(['Weather','Food'])
for name, group in wf_group:
print(name)
print(group)
##以两种数据分组


##通过agg()可以对数据组施加一系列的NumPy函数
print(wf_group.agg([np.mean,np.median]))
##通过agg()可以对数据组施加一系列的NumPy函数

6.DataFrame的串联与附加操作

import numpy as np
import pandas as pd
data = {'Weather' : ['cold', 'hot', 'cold', 'hot',
'cold', 'hot', 'cold'],
'Food' : ['soup', 'soup', 'icecream', 'chocolate',
'icecream', 'icecream', 'soup'],
'Price' : 10 * np.random.rand(7), 'Number' : np.random.random_integers(1, 9, size=(7,))}
df = pd.DataFrame(data) #根据字典创建DataFrame
print(pd.concat([df[:3],df[3:]])) #串联
print(df[:3].append(df[5:])) #串联

7.连接DataFrame
pandas提供的merge()或DataFrame的join()都能实现类似数据库的连接操作功能。默认情况下,join()会按照索引进行连接。链接分为:内部连接、左外连接、右外连接与完全外部连接等。内部操作,指从两个数据表中选取数据,只要两个表中连接条件规定的列上存在相匹配的值,相应的数据就会被组合起来。对于外部连接,由于不需要进行匹配处理,将会返回很多数据。

import numpy as np
import pandas as pd
dests = pd.read_csv('dest.csv')
tips = pd.read_csv('tips.csv')
print(pd.merge(dests,tips,on='EmpNr')) #内部链接,按员工编号进行连接处理
print(dests.join(tips,lsuffix='Dest',rsuffix='Tips')) #索引值链接,感觉不太好用
print(pd.merge(dests,tips,how='inner')) #内部连接
print(pd.merge(dests,tips,how='outer')) #外部连接

注意:列中非数字的数值可能会被标为nan,这些通常是由输入数据文件中的空字段引起的。
8.处理缺失数据问题
对于pandas来说会将缺失数据标记为NaN,表示None。对于NaN进行算数运算是,得到的结果还是NaN。如果进行统计学方法,如求和或者求平均数,可能会将NaN当作0看待。然而,在求和过程中,如果所有数据都是NaN,则结果为NaN。进行聚合操作时,我们组合的列内的NaN值会被忽略。数+np.nan = nan。

import numpy as np
import pandas as pd
df = pd.read_csv('WHO_first9cols.csv')
df = df[['Country',df.columns[-2]]][:2] #选两列三行
null = pd.isnull(df) #检查缺失数据,缺失数据用NaN表示
notnull = pd.notnull(df) #检查非NaN数据
#数+np.nan = nan
print(df.fillna(0)) #用0补NaN

9.处理日期数据
pandas可以处理的日期范围为1677年9月21日00:12:44——2262年4月11日23:47:16

import numpy as np
import pandas as pd
print(pd.date_range('1/1/1990',periods=42,freq='D'))#生成时间列表,周期为42天,D
print(pd.to_datetime(['19931112','1/1/1992']))#将字符串转化为日期数据

10.数据透视表
pandas的API提供了pivot_table()函数,只要设置好aggfunc参数,就可以让这个聚合函数来执行NumPy中诸如sum(),max()之类的方法。参数columns表示要对哪些列进行聚合运算。

import numpy as np
import pandas as pd
data = {'Weather' : ['cold', 'hot', 'cold', 'hot',
'cold', 'hot', 'cold'],
'Food' : ['soup', 'soup', 'icecream', 'chocolate',
'icecream', 'icecream', 'soup'],
'Price' : 10 * np.random.rand(7), 'Number' : np.random.random_integers(1, 9, size=(7,))}
df = pd.DataFrame(data) #根据字典创建DataFrame
print(pd.pivot_table(df,columns=['Food'],aggfunc=np.max)) #np.max不能加括号
print(pd.pivot_table(df,columns=['Food'],aggfunc=np.sum)) #np.sum不能加括号

WALDM