import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
Pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数据包开发的PyData开发team继续开发和维护,属于PyData项目的一部分。
NumPy系统是Python的一种开源的数值计算扩展,可用来存储和处理大型矩阵。包括:1、一个强大的N维数组对象Array;2、比较成熟的(广播)函数库;3、用于整合C/C++和Fortran代码的工具包;4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。
Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
pandas中的数据类型:Series,DataFrame,Panel。
一、创建对象
1,通过传递一个list对象来创建一个Series,pandas会默认创建整型索引:
s=pd.Series([1,3,5,np.nan,6,8])
dates=pd.date_range("20120101",periods=6)
df=pd.DataFrame(np.random.randn(6,4), index=dates, columns=list("ABCD"))
3,通过传递一个能够被转换成类似序列结构的字典对象来创建一个DataFrame:
df2=pd.DataFrame({'A':1.,
'B':pd.Timestamp('20130102'),
'C':pd.Series(1,index=list(range(4)),dtype='float32'),
'D':np.array([3]*4,dtype='int32'),
'E':pd.Categorical(["test","train","test","train"]),
'F':'foo'
})
# 查看数据类型
df2.dtypes
二、查看数据
1,查看头部和尾部的行:
df.head()
df.tail(3)
# 显示索引,列,底层的numpy数据
df.index
df.columns
df.values
2,describe()函数对于数据的快速统计汇总:
df.describe()
3,对数据的转置,按轴进行排序,按值进行排序:
df.T
df.sort_index(axis=1, ascending=False)
# 按值排序
df.sort(columns='B')
虽然标准的Python/Numpy的选择和设置表达式都能够直接派上用场,但是作为工程使用的代码,推荐使用经过优化的pandas数据访问方式: .at, .iat, .loc, .iloc 和 .ix
SQL中的select是根据列的名称来选取;Pandas则更为灵活,不但可根据列名称选取,还可以根据列所在的position(数字,在第几行第几列,注意pandas行列的position是从0开始)选取。相关函数如下:
1)loc,基于列label,可选取特定行(根据行index);
2)iloc,基于行/列的position;
3)at,根据指定行index及列label,快速定位DataFrame的元素;
4)iat,与at类似,不同的是根据position来定位的;
5)ix,为loc与iloc的混合体,既支持label也支持position;
1).loc,.iloc,.ix,只加第一个参数如.loc([1,2]),.iloc([2:3]),.ix[2]…则进行的是行选择
2).loc,.at,选列是只能是列名,不能是position
3).iloc,.iat,选列是只能是position,不能是列名
4)df[]只能进行行选择,或列选择,不能同时进行列选择,列选择只能是列名。
1,获取
# 选择一个单独的列,返回一个series,等同df.A
df['A']
df.A
# 通过[]进行选择,将对行进行切片,且不能同时进行列选择,列选择只能是列名。
df[0:3]
2,通过标签选择
1)使用标签获取一个交叉的区域
# 取得第一行,返回索引为列,Name=时间
df.loc[dates[0]]
2)通过标签在多个轴上进行选择
df.loc[:, ['A', 'B']]
3)标签切片
df.loc['20120101':'20130101', ['A', 'B']]
4)对返回的对象进行维度缩减
df.loc['20120101', ['A', 'B']]
5)获取一个标量
df.loc[dates[0], 'A']
6)快速访问一个标量,与5等价
df.at[dates[0], 'A']
3,通过位置选择
1)通过传递数值进行位置选择(选择的是行)
df.iloc[3]
2)通过数值进行切片,与numpy类似
df.iloc[[0:3], [0:2]]
df.iloc[[1,2,3], [0,1]]
df.iloc[1:3, :]
df.iloc[:, 1:3]
5)获取特定的值
df.iloc[1,1]
df.iat[1,1]
1)使用一个单独的列的值来选择数据
df[df.A>0]
df[df>0]
df2 = df.copy()
df2['E'] = ['one', 'two', 'three', 'four']
df2[df2['E'].isin(['two', 'four'])]
1)设置新的列
s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130101', periods=6))
df['F'] = s1
df.at[dates[0], 'A'] = 0
df.iat[0,1] = 0
df.loc[:, 'D'] = np.array([5]*len(df))
df2 = df.copy()
df2[df2>0] = -df2
四、缺失值处理(pandas中,使用np.nan来代替缺失值,这些值将默认不会包含在计算中)
1)reindex()方法可以对指定轴上的索引进行改变/增加/删除操作,且返回原始数据的一个拷贝
df1 = df.reindex(index=dates[0:4], columns=list(df.columns)+['E'])
df1.loc[dates[0]:dates[1],'E']=1
2)去掉包含缺失的行
df1.dropna(how='any')
df1.fillna(value=5)
pd.isnull(df1)
五、相关操作
1)执行描述性统计
df.mean()
df.mean(1)
s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2)
df.sub(s, axis='index')
4)对数据应用函数
df.apply(np.cumsum)
df.apply(lambda x: x.max()-x.min())
5)直方图
s = pd.Series(np.random.randint(0, 7, size=10))
s.value_counts()
6)字符串方法
s = pd.Series(['A', 'B', 'C', 'AaBb', 'np.nan', 'ABCD', 'dog', 'cat'])
s.str.lower()