MongoDB Note And Pandas
文章目录
概念
MongoDB非常强大且容易上手。 - 文档(document)是MongoDB中数据的基本单元,非常类似于关系数据库的行,但更有表现力。 - 集合(collection)可以看做是一个拥有动态模式的表。 - MongoDB的一个实例可以拥有多个相互独立的数据库,每个数据库都拥有自己的集合。
因为文档和集合是动态的,所以这两个都具有很强的表现力。
文档
文档是MongoDB的核心概念。文档就是一个键值对
。python中的字典,javascript中的对象。这种键值对可简单也可很复杂。
MongoDB对键
是字符串,有两条简单的约束:
- 键不能含有\0
(空字符)。这个字符用于表示键的结尾。
- .
和$
具有特殊意义,通常这两个是保留字符,所以建议不要用在键
中。
集合
集合就是一组文档。如果将MongoDB中的一个文档比喻为关系数据库中的一行,那个一个集合就相当于一张表。 MongoDB中的集合是可以动态构建的。即在插入数据时,如果没有某个集合,则自动创建。
客户端
日常分析数据时,需要便捷的客户端,这里强烈推荐Robomongo,真的是超级方便啊。
查询
先查看这里http://docs.mongoing.com/manual/reference/sql-comparison.html#select,以后再总结。
排除不包含status
键的document
: db.collection.find({'status': {$ne: null}})
。
索引
数据量大的时候,可以建立索引以便加快查询的速度。
查看索引 db.collection.getIndexes()
db.collection.ensureIndex({status:1 }) 1
代表索引的方向,为正向。
管理
参考 > mongodb 备份 还原 导出 导入
数据操作(pandas)
把mongo和python连接起来就是分析数据的利器了,而这个工具就是pandas。
首先要把需要分析数据导入到pandas中参考How to import data from mongodb to pandas?。
那么pandas中最重要的就是DataFrame了,一般简写为df
。
接下来最重要的就是操作df
,首先是要取数据,开始常用的是按位置取值iloc
取值
是pandas的强悍功能。
操作符 | 含义 |
---|---|
obj.ix[:, val]obj.loc[:val]obj.iloc[:val]obj.icol(val) | obj[val] 从Series选择单个值/多个值可以切片,可以是单个值从DataFrame选择单一列/多列obj[val] val是 字符的列标签 |
obj[布尔数据] | Series: 过滤 值DataFrame: 过滤行 |
obj[col]obj[[col1, col2]] | 选择列选择多列 |
obj[1:3] obj['b':'d'] |
Series: 切片DataFrame: 行切片(取1-3行,0坐标) |
obj.ix[val]obj.loc[val]obj.iloc[val]obj.irow(val) | 从DataFrame的行集选择单行/多行 |
obj.ix[val1, val2] | 选择DataFrame行和列 |
obj.loc[] | df.loc[row_indexer,column_indexer] str标签 |
obj.iloc[] | df.loc[row_int,column_int] int标签 |
下标选取数据
df['one']
df.one
以上两个语句是等效的,都是返回df名称为one列的数据,返回的为一个Series。
df[0:3]
另外已经不支持,不要使用,请使用df[0]
df.iloc[0]
。
下标索引选取的是DataFrame的记录(行),与List相同DataFrame的下标也是从0开始,区间索引的话,为一个左闭右开的区间,即[0:3]
选取的为1-3三条记录。
与此等价,还可以用起始的索引名称和结束索引名称选取数据:
df['a':'b']
有一点需要注意的是使用起始索引名称和结束索引名称时,也会包含结束索引的数据。以上两种方式返回的都是DataFrame。
标签选取数据
df.loc[行标签,列标签]
df.loc['a':'b'] #选取ab两行数据
df.loc[:,'one'] #选取one列的数据
df.loc的第一个参数是行标签,第二个参数为列标签(可选参数,默认为所有列标签),两个参数既可以是列表也可以是单个字符,如果两个参数都为列表则返回的是DataFrame,否则,则为Series。
位置选取数据
df.iloc[行位置,列位置]
df.iloc[1,1] #选取第二行,第二列的值,返回的为单个值
df.iloc[0,2],:] #选取第一行及第三行的数据
df.iloc[0:2,:] #选取第一行到第三行(不包含)的数据
df.iloc[:,1] #选取所有记录的第一列的值,返回的为一个Series
df.iloc[1,:] #选取第一行数据,返回的为一个Series
df.iloc[-1,:] #选取最后一行数据,返回的为一个Series, 支持 -1
PS:loc为location的缩写,iloc则为integer & location的缩写
更广义的切片方式是使用.ix,它自动根据你给到的索引类型判断是使用位置还是标签进行切片
df.ix[1,1]
df.ix['a':'b']
标量取值
df.at['a', 'one']
df.iat[0, 2]
.at
和.iat
只能取标量,即只能取单个值
这与.loc
和 .iloc
不同,.loc
和 .iloc
能使用x:y
取一个范围,也能取标量。
那为什么要有.at
和.iat
,因为取单个值的时候,.at
和.iat
的速度是很快的。
逻辑array选取数据
df[逻辑条件]
df[df.one >= 2] #单个逻辑条件
df[(df.one >=1 ) & (df.one < 3) ] #多个逻辑条件组合
df[(df.username == '') & map(lambda x: x['user_id']=='', df.context)]
或
c = [True, False, True]
df[c]
df.iloc[:, c]
df.loc[:, c]
df.loc[c, :]
说明:
> |
代表 or
, &
代表 and
, and ~
代表 not
> 这种方式获得的数据切片都是DataFrame。
> pandas中的Boolean indexing必须是包含True
或Fasle
的list
。包含0
或1
得不到想要的值,不能是迭代器
,必须是list
。
> 下标bool取值只能过滤记录(行),所以既要过滤行又要过滤列,直接使用标签或位置bool取值
> iloc、loc等等也都可以使用Boolean indexing,如c = [True, Fasle]; df.iloc[:, c]
。