汇总和计算描述统计
pandas对象拥有一组常用的数学和统计方法。它们大部分都属于约简和汇总统计,用于从Series中提取单个值(如sum或mean)或从DataFrame的行或列中提取一个Series。
df = DataFrame([[1.4, np.nan], [7.1, -4.5],
[np.nan, np.nan], [0.75, -1.3]],
index=['a', 'b', 'c', 'd'],
columns=['one', 'two'])
df.sum()
df.sum(axis=1)
df.mean(axis=1, skipna=False)
# 返回达到最小值的索引
df.idxmax()
# 返回达到最大值的索引
df.idxmin()
# 按某个轴累和
df.cumsum(axis)
# 一次性产生多个汇总统计
df.describe()
对于非数值型的数据,describe会产生另外一种汇总统计。
相关系数与协方差
有些汇总统计(如相关系数和协方差)是通过参数对计算出来的。
# Series的corr方法用于计算两个Series中重叠的、非NA的、按索引对齐的值的相关系数,与此类似,cov用于计算协方差
series1.corr(series2)
series1.cov(series2)
# DataFrame的corr和cov方法将以DataFrame的形式返回完整的相关系数或协方差矩阵
df.corr()
df.cov()
# 利用DataFrame的corrwith方法,可以计算其列或行跟另一个Series或DataFrame之间的相关系数
# 传入一个Series将会返回一个相关系数值Series
df.corrwith(series)
# 传入一个DataFrame则会计算案列名配对的相关系数
df1.corrwith(df2)
唯一值、值计数以及成员资格
还有一类方法从一维Series的值中抽取信息
# 得到series中的唯一值数组
series.unique()
# 统计series中各值出现的频率
series.value_counts()
# 判断矢量化集合的成员资格
mask = series.isin(['b','c'])
# 返回series中含有'b'或'c'的数据
obj[mask]
处理缺失数据
缺失数据在大部分数据分析应用中都很常见,pandas的设计目标之一就是让缺失数据的处理任务尽量轻松。
过滤缺失数据
dropna()返回一个仅含有非空数据和索引值的Series,当然也可以通过布尔型索引达到这个目的
data.dropna()
data[data.notnull()]
对于DataFrame来说
# how是过滤方式,axis是过滤轴
frame.dropna(how='',axis='',thresh='')
填充缺失数据
有时候我们并不想滤除缺失数据,而是希望通过其他方式填补哪些“空洞”,我们可以运用fillna来实现。
# 缺失值全部填0
df.fillna(0)
# 通过字典实现不同列填充不同值,key是列名,value是填充值
df.fillna({1:0.5,3:-1})
# fillna默认返回新对象,如果inplace设置为True,则是进行就地修改
df.fillna(0,inplace=True)
# 对于reindex有效的插值方法都可以运用于fillna,limit限制插值个数
df.fillna(method='ffill',limit=2)
层次化索引
层次化索引(hierarchical indexing)是pandas的重要功能之一,它使你能在一个轴上拥有多个(两个以上)索引级别。抽象点说,它使你能以低维度形式处理高维度数据。
data = Series(np.random.randn(10),
index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd', 'd'],
[1, 2, 3, 1, 2, 3, 1, 2, 2, 3]])
这就是带有MultiIndex索引的Series的格式化输出形式,索引之间的“间隔”表示直接使用上面的标签。
对于一个层次化索引的对象,选取数据子集的操作很简单
data['b']
data['b':'c']
data.ix[['b','d']]
# 对内层进行选取
data[:,2]
# 使用unstack()将多层series转换为dataframe
data.unstack()
# unstack()逆运算stack()
data.unstack().stack()
对于DataFrame,每条轴都可以有分层索引:
frame = DataFrame(np.arange(12).reshape((4, 3)),
index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],
columns=[['Ohio', 'Ohio', 'Colorado'],
['Green', 'Red', 'Green']])
通过观察frame的index和columns,我们也可以看出索引的层次化
各层都可以有名字,如果指定了名称,它们就会显示在控制台输出中(不要讲索引名称和轴标签混为一谈)
frame.index.names = ['key1', 'key2']
frame.columns.names = ['state', 'color']
重排分级顺序
有时我们需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象。
frame.swaplevel('key1', 'key2')
sortlevel则根据单个级别中的值对数据进行排序
# level为0表示排序外层即key1,1表示内层即key2
frame.sortlevel(1)
根据级别汇总统计
许多对DataFrame和Series的描述和汇总统计都有一个level选项,它用于指定在某条轴上求和的级别。再以上面那个DataFrame为例,我们可以根据行列上的级别来进行求和
frame.sum(level='key2')
frame.sum(level='color',axis=1)
这其实是利用了pandas的groupby功能
使用DataFrame的列
frame = DataFrame({'a': range(7), 'b': range(7, 0, -1),
'c': ['one', 'one', 'one', 'two', 'two', 'two', 'two'],
'd': [0, 1, 2, 0, 1, 2, 3]})
DataFrame的set_index函数会将其一个或多个列转换为行索引
frame2 = frame.set_index(['c','d'])
frame3 = frame.set_index(['c','d'],drop=False)
默认情况下,那些列会从DataFrame中移除,但也可以将其保留下来
、
reset_index的功能跟set_index刚好相反,层次化索引的级别会被转移到列里面
frame2.reset_index()