学习Python数据分析第四天——查询和过滤
查询和过滤
DataFrame是pandas的核心数据结构,可以理解为Excel里的二维矩阵,它更高级,能表达3维或更高维的数据,支持多索引。在内存中存取,效率极高,绝大多数操作都和DataFrame相关。维度为2的DataFrame,行(column)和列(row)的axis分别为0和1。可以针对某些列做索引(index),高维DataFrame是相当少见的。
1 查询
下面的表展示了Pandas对索引的介绍:
符号 | 说明 | 例子 |
---|---|---|
[] | 列值索引 | df['房价'] ,df[['房价','车价']] |
loc | 行值索引 | df.loc[0], df['2013':'2015'] |
iloc | 行号索引 | df.iloc[0], df.iloc[2:10] |
ix | 行索引 | df.ix[0], df.ix[2:10] |
时间也是比较重要的index,比较好用的是Timestamp,接受2016-12-24这种字符串,字符串到时间转换代码如下:
weather.index= weather[u'日期'].map(lambda x:Timestamp(x))
Pandas的索引功能非常强大,补充如下:
loc也能支持先行后列的查询:df.loc['20130101':'20130103' , ['A','B']],类似的如iloc
个人感觉ix的有些冗余,和ix和iloc类似
所有索引都支持字符串和数组,以及切片(slice)用于指定范围,索引还能传递一个bool类型的lambda表达式,或返回和其shape一致的bool数组
2 过滤
过滤有两方面需求:找出特定数据进行针对性分析,或
针对特定数据做分析,
过滤异常值。
异常值非常重要,应该细致分析导致它们产生的原因,如果真是异常值,应该提早过滤,否则做聚合时会严重影响结果,如天价的房价。
先讨论按行过滤:非空过滤,过滤掉col列为空的内容:
df=df[!data.col.isnull()]
字符串过滤:
db[db.city.str.contains(u'市')]
若需要对df对某个键去重:
qq['id'].unique()
isin能判断单元格中的值是否在给定的数组内,若希望对多个列做过滤,Pandas提供了现成的方法df.filter,还支持正则。还能进行逻辑操作,实现更复杂的需求。
3 遍历
有了索引和列操作,为何还要有遍历?因为遍历更加灵活,当然性能相对会差一些:
函数 | 遍历目标 | lambda参数 | 说明 |
---|---|---|---|
map | 一列的cell | cell | 最为常见 |
apply | 列/行 | 列或行的Series | axis:不填写cell,1:行,2:列 |
applymap | cell | cell | element-wise最为灵活 |
iterrows | 行遍历 | 提供行号 | 见备注 |
iteritems | 列遍历 | 提供列名 | 见备注 |
itertuples | 行遍历 | 提供index | 见备注 |
map, apply,applymap是只返回单元格或行列本身的,参数都是lambda,本节假设读者对python的lambda表达式有足够的了解。
但这样不能实现如“奇数偶数行做分别作不同处理的需求,则这三个函数就无能为力。因此就有后面iterrows等三个函数。如iterrows,它会将行号和行迭代出来,从而方便自定义逻辑,示例如下:
for i,row in data.iterrows():
pass
4 求值和合并
一张表可能很难包含所有的信息,因此需要计算新值(求值)或join其他表(合并),但Pandas本身的Join并不好用,经常出错。
如果某个属性可以通过计算获得,可对各个列当做变量来处理,由于内部使用了C++和numpy加速,效率远比for循环更高,下面是处理房价的一个例子:总价/单价,并做小数点截取:
table['面积']= np.round(table['总价']*10000/table['单价'])
numpy提供了绝大多数常见的函数算子,能满足大部分需求。下面是合并:
- 横向合并(需保证行数一致)- 横向合并 df = pd.concat([data_train, dummies_Cabin])
- 删除列 df.drop(['Pclass', 'Name', 'Sex')]
- 纵向合并(join操作)
data.merge(right=prop_rates, how='inner',left_on='Property_Area',right_index=True, sort=False)
如果不加参数,则可以自动通过列名合并。join的参数比较复杂,建议直接参考Pandas官方文档。
当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »