Python数据分析|第5章 pandas入门
2017-01-18 16:05
423 查看
pandas的数据结构介绍
Series
是由数组+索引组成from pandas import Series, DataFrame import pandas as pd obj=Series([4,7,-5,4]) obj Out[5]: 0 4 1 7 2 -5 3 4 dtype: int64
指定索引
obj2=Series([4,7,-5,3],index=['d','b','a','c']) obj2 Out[7]: d 4 b 7 a -5 c 3 obj2.index Out[8]: Index([u'd', u'b', u'a', u'c'], dtype='object')
通过字典来创建Series
sdata={'A':35000,'B':70000,'C':9000} obj3=Series(sdata) obj3 Out[11]: A 35000 B 70000 C 9000
Series在算术运算中会自动对齐不同索引的数据,如果有缺失值最后显示缺失值
DataFrame
直接传入数据,然后输入:frame=DataFrame(data,columns=['year','state','pop'])#可按指定顺序排序,也可不写
可用index指定固定位置,填入数据,未指定位置为缺失值
val=Series([-1.2, -1.5, -1.7], index=['two','four','five'])
删除列
del frame2['eastern']
基本功能
重新索引reindex
obj2=obj.reindex(['a','b','d','c','e']) #可重新排列顺序 obj2=obj.reindex(['a','b','d','c','e','f'],fill_value=0)#新加的值显示为0,否则为NaN
使用ffill可以实现前向值填充
obj3=Series(['blue','purple','yellow'],index=[0,2,4]) obj3.reindex(range(6),method='ffill') Out[13]: 0 blue 1 blue 2 purple 3 purple 4 yellow 5 yellow
method选项 | 说明 |
---|---|
fill或pad | 前向填充(或搬运)值 |
bfill或backfill | 后向填充(或搬运)值 |
frame.reindex(['a','b','c','d'])#行索引 frame.reindex(columns=['a','b','c','d'])#列索引
丢弃指定轴上的项
obj.drop()
索引、选取和过滤
索引选项类型 | 说明 |
---|---|
obj[] | 选取列 |
obj.ix | 选取行 |
obj.ix[:,val] | 选取单个列或列子集 |
obj.ix[val1,val2] | 同时选行和列 |
reindex方法 | 新索引 |
xs方法 | 根据标签选取单行单列,返回一个Series |
icol、irow方法 | 根据整数位置选取 |
get_value、set_value方法 | 根据行列标签选取单个值 |
算术运算和数据对齐
pandas会自动对齐索引,不对齐会有缺失值可以使用传入方式来避免
df1.add(df2,fill_value=0)#算术方法:add,sub,div,mul
DataFrame和Series之间的运算叫做广播,Series产生的运算效果会在DataFrame每一行实现
import numpy as np arr=np.arange(12.).reshape((3,4)) arr Out[18]: array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]]) arr[0] Out[19]: array([ 0., 1., 2., 3.]) arr-arr[0] Out[20]: array([[ 0., 0., 0., 0.], [ 4., 4., 4., 4.], [ 8., 8., 8., 8.]])
在列上广播需要使用算术运算方法,如
frame.sub(series3,axis=0)
函数应用和映射
frame=DataFrame(np.random.randn(4,3),columns=list('bde'),index=['A','B','C','D']) frame Out[23]: b d e A -0.755157 -0.443902 -0.052897 B -1.426624 0.969115 -0.803178 C 0.100829 -1.558963 0.421726 D -1.290333 1.158463 0.918981 f=lambda x:x.max()-x.min() frame.apply(f) Out[25]: b 1.527453 d 2.717425 e 1.722159 dtype: float64 frame.apply(f,axis=1) Out[26]: A 0.702260 B 2.395739 C 1.980689 D 2.448795 dtype: float64
def f(x): return Series([x.min(),x.max()],index=['min','max']) frame.apply(f) Out[28]: b d e min -1.426624 -1.558963 -0.803178 max 0.100829 1.158463 0.918981
applymap-元素级函数
format=lambda x:'%.2f'%x frame.applymap(format) Out[30]: b d e A -0.76 -0.44 -0.05 B -1.43 0.97 -0.80 C 0.10 -1.56 0.42 D -1.29 1.16 0.92
map
frame['e'].map(format) Out[31]: A -0.05 B -0.80 C 0.42 D 0.92
排序和排名
按索引排序frame.sort_index() frame.sort_index(axis=1)#行倒序,列正序 frame.sort_index(axis=1,ascending=False)#均倒序
按值排序
obj.order()
by选项
frame=DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]}) frame.sort_index(by='b') Out[33]: a b 2 0 -3 3 1 2 0 0 4 1 1 7
汇总和计算描述统计
df.sum(axis=1,skipna=False)
选项 | 说明 |
---|---|
axis | 约简的轴。DataFrame的行用0,列用1 |
skipna | 排除缺失值,默认值为True |
level | 如果轴是层次化索引的(Multilndex),则根据level分组 |
方法 | 说明 |
---|---|
count | 非NA值的数量 |
describe | 总统计 |
min、max | |
argmin、argmax | 最大最小值的索引位置 |
idxmin、idxmax | 最大最小值的索引值 |
quantile | 分位数 |
sum、mean、median | |
mad | 根据平均值计算平均绝对离差 |
var、std、skew、kurt | |
cumsum | 累计和 |
cummin、cummax、cumprod | 累计最大最小,累计积 |
diff | 一阶差分(时间序列) |
pct_change | 百分数变化 |
相关系数与协方差
returns.MSFT.corr(returns.IBM)#相关系数 returns.MSFT.cov(returns.IBM)#协方差
整体
returns.corr() returns.cov()
corrwith计算一个DataFrame和一个Series之间的相关系数
returns.corrwith(returns.IBM)#axis=1可进行行计算
唯一值、值计数以及成员资格
obj.unique() #唯一 obj.value_counts()#计算一个Series中各值出现的频率 pd.value_counts(obj.values,sort=False) #频率排序 mask=obj.isin(['b','c']) #成员资格 obj[mask]
处理缺失数据
方法 | 说明 |
---|---|
dropna | 过滤 |
fillna | 用指定值或插值方法填充 |
isnull | 判断 |
notnull | isnull的否定式 |
from numpy import nan as NA data=Series([1,NA,3.5,NA,7]) data.dropna() data=DataFrame([[1.,6.5,3.],[1.,NA,NA],[NA,NA,NA],[NA,6.5,3.]]) cleaned=data.dropna() #drop任何含有缺失值的行 data.dropna(how='all') #drop全为NA的行 data.dropna(axis=1,how='all') #drop全为NA的列
填充
df.fillna(0) #缺失值替换为0 _=df.fillna(0,inplace=True) #对现有对象就地修改 from numpy import nan as NA df=DataFrame(numpy.random.randn(6,3)) df.ix[2:,1]=NA;df.ix[4:,2]=NA df Out[14]: 0 1 2 0 -1.159237 1.070004 -0.814501 1 -1.222677 0.715792 -0.965154 2 1.051073 NaN -0.662791 3 -0.464988 NaN 1.346032 4 -0.725837 NaN NaN 5 -0.216968 NaN NaN df.fillna(method='ffill',limit=2) Out[16]: 0 1 2 0 -1.159237 1.070004 -0.814501 1 -1.222677 0.715792 -0.965154 2 1.051073 0.715792 -0.662791 3 -0.464988 0.715792 1.346032 4 -0.725837 NaN 1.346032 5 -0.216968 NaN 1.346032
fillna函数
参数 | 说明 |
---|---|
value | 填充值 |
method | 插值方式,默认为ffill |
axis | 待填充的轴,默认axis=0 |
inplace | 就地修改对象 |
limit | 修改数 |
层次化索引
以低维度处理高维度data=Series(numpy.random.randn(10), index=[['a','a','a','b','b','b','c','c','d','d'], [1,2,3,1,2,3,1,2,2,3]]) data Out[19]: a 1 -0.269781 2 1.247638 3 -0.537622 b 1 0.604351 2 0.124396 3 -1.991048 c 1 0.067274 2 -0.816543 d 2 -0.106579 3 -1.037246 data['b':'c'] Out[20]: b 1 0.604351 2 0.124396 3 -1.991048 c 1 0.067274 2 -0.816543 data[:,2] Out[21]: a 1.247638 b 0.124396 c -0.816543 d -0.106579
unstack重新安排
data.unstack() Out[22]: 1 2 3 a -0.269781 1.247638 -0.537622 b 0.604351 0.124396 -1.991048 c 0.067274 -0.816543 NaN d NaN -0.106579 -1.037246 data.unstack().stack() #unstack逆运算 frame=DataFrame(numpy.arrange(12).reshape((4,3)),index=[……],columns=[……])
重排分级顺序
frame.swaplevel('key1','key2') #其中key1,key2是列名称 frame.index.names=[] frame.columns.names=[] #sortlevel是对单个级别数据排序 frame.swaplevel(0,1).sortlevel(0) #先交换再排序
级别汇总
frame.sum(level='key2') frame.sum(level='color',axis=1)
相关文章推荐
- 《利用Python进行数据分析·第2版》第5章 pandas入门个人重点
- pandas入门 《利用Python进行数据分析》读书笔记 第5章
- 《利用Python进行数据分析》笔记---第5章pandas入门
- pandas入门【二】
- pandas入门(二)
- 刘汝佳 算法竞赛入门经典 第5章 C++与STL入门
- Pandas快速入门(一)
- Pandas简易入门(二)
- Pandas入门(二)——DataFrame结构及常用操作
- Pandas简易入门(二)
- 利用Python数据分析:pandas入门(四)
- Pandas的简单入门
- Pandas入门:DataFrame的简单应用
- Pandas库入门
- 10分钟入门pandas(二)
- pandas入门(一)
- 数据挖掘 pandas基础入门之操作
- pandas入门——数据的读取
- pandas入门——数据分组
- pandas入门——loc与iloc函数