《利用python进行数据分析》学习笔记(五)(下)

汇总和计算描述统计

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()

这里写图片描述


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值