数据分析篇(五)
- 2019 年 10 月 6 日
- 笔记
实例:
# 导入模块
import pandas as pd
import numpy as np
# pandas创建一个二维数组
attr = pd.DataFrame(np.arange(12).reshape(3,4))
print(attr)
输出:
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
# 和numpy不同的是在第一行和第一列的地方多了索引。
# 行索引叫做index,是0轴
# 列索引叫做columns,是1轴
我们试着添加两个参数:
attr = pd.DataFrame(np.arange(12).reshape(3,4),index=list('qwe'),columns=list('zxcv'))
就会是另一种结果。
z x c v
q 0 1 2 3
w 4 5 6 7
e 8 9 10 11
DataFrame也是可以传入字典的。
dict = {'name':['张三','李四'],'age':[18,20],'tel':[10010,10086]}
attr1 = pd.DataFrame(dict)
pritnt(attr1)
会输出:
name age tel
0 张三 18 10010
1 李四 20 10086
同样,放入列表也是一样的。
属性:
# 获取行索引
attr2.index
# 获取列索引
attr2.columns
# 获取值
attr2.values
# 查看几行几列
attr2.shape
# 查看类型
attr2.dtype
# 查看数据的维度
attr2.ndim
# 显示前几行数据,默认为5行
attr2.head(2) # 取前两行数据
# 显示末尾几行数据,默认为5行
attr2.tail(2) # 取末尾两行数据
# 查看详细信息,行,列,索引,类型,内存等
attr2.info()
# 快速统计均值,标准差,最大值,最小值,四分位
attr2.describe()
# 当然只会统计数字类型的。
DataFrame排序
# 按照年龄排序(从小到大)
attr2 = attr2.sort_values(by="age")
# 从大到小
attr2 = attr2.sort_values(by="age",ascending=False)
# 取行或取列
# 以下我们认为attr3中有很多数据,字段还是和上面的一样
# 取前50行数据
attr3[:50]
# 取前20行的name字段
attr3[:20]['name']
# 单独取某一列的数据
attr3['name']
# 通过标签取某个值
# attr4数据假如是这样
name age tel
0 张三 18 10010
1 李四 20 10086
attr4.loc['0','name'] # 李四
attr4.loc['1'] # 李四 20 10086
attr4.loc['1',:] # 李四 20 10086
attr4.loc[:,'age'] # 18 20
取多行
attr4.loc[['0','1']]
取多列
attr4.loc[:,['name','age']]
# 通过索引来取值
attr4.iloc[1,:] # 取第二行
attr4.iloc[:,1] # 取第二列
attr4.iloc[:,[0,2]] # 取第一列和第三列
attr4.iloc[[0,1],[0,2]] # 取第一行和第二行的第一列和第三列
# 布尔索引
# 取出年龄大于10的
attr4[attr4['age']>10]
# 取出年龄大于10,小于20的
attr4[(10<attr4['age'])&(attr4['age']<20)]
# &表示and |表示或
pandas中字符串的方法
# 这里只介绍常用几种
# 模糊查询名字含有三的是str.contains()
a = attr1.loc[attr1['name'].str.contains('三')]
print(a)
# str.lower(),str.upper() 转换大小写
# str.replace() 替换字符串
# str.split() 分割
# str.len() 获取长度
等等,还有很多。
缺失数据的处理
我们如果读取爬去到的大量数据,可能会存在NaN值。
出现NaN和numpy中是一样的,表示不是一个数字。
我们需要把他修改成0获取其他中值,来减少我们计算的误差。
# 判断是否为NaN
pd.isbull(attr4) # 还有一个pd.notbull(attr4) 刚好相反
# 取值不为空的name列
attr4[pdnotnull(attr4['name'])]
# 删除存在NaN的行
attr4.deopna(axis=0) # 列就是axis = 1
# 想删除某一列全部为NaN的行
attr4.deopna(axis=0,how='all')
# 只要有一个NaN就删除,也就是默认的
attr4.deopna(axis=0,how='any')
# 把所有NaN填充为0
attr4.fillna(0)
# 填充均值
attr4.fillna(attr4.mean())
# 赋值为NaN值
att4['age'][0] = np.nan
# 赋值为0的数据为NaN
attr4[attr4==0] = np.nan
nan是不会参与平均值等计算的,0会参与计算。
pandas 连接MongoDB数据库
# 导入操作MongoDB的模块
from pymongo import MongoClient
import pandas as pd
# 链接
client = pymongo.MongoClient()
# 读取
db = client['xxx']['xxxx']
data = pd.DataFrame(list(db.find()))
即可。
# 平均数(age)
attr4['age'].mean()
# max,mix等都是一样的
# 假如name中有重复的,我们想获取有多人人,重复的去除
len(attr4['name'].unique())