是由数组+索引组成
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在算术运算中会自动对齐不同索引的数据,如果有缺失值最后显示缺失值
直接传入数据,然后输入:
frame=DataFrame(data,columns=['year','state','pop'])#可按指定顺序排序,也可不写
可用index指定固定位置,填入数据,未指定位置为缺失值
val=Series([-1.2, -1.5, -1.7], index=['two','four','five'])
删除列
del frame2['eastern']
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 | 后向填充(或搬运)值 |
对于DataFrame,reindex可以修改行列索引
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的否定式 |
1. 滤除
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)