import numpy as np
import pandas as pd
from pandas import Series, DataFrame
from numpy import nan as NA
01.pandas基本数据结构
Series可看作带索引的单列数据。DataFrame则是表格型数据结构
pd.Series(data=None, index=None, dtype=None, name=None)
pd.DataFrame(data, index=None, columns=None, dtype=None)
自定义索引
pd.Series(data=None, index=None, dtype=None, name=None)
data:list/tuple/ndarray/dict/iterable
index:自定义索引:一维/多维LIST,或索引对象
读取Series
xxSeries[index]
xxSeries.loc[自定义索引]
xxSeries.iloc[0-n数字索引]
读取DataFrame
xxDataFrame[yy] xxDataFrame.column # 一列
xxDataFrame[[col1,col2,..]] # 多列
xxDataFrame.loc[index, column]
对DataFrame进行修改/新增数据
xxdf['已存在列'] = yyy # 修改
xxdf['不存在列'] = yyy # 新增 若yyy是Series,会进行索引匹配
xxdf.loc['已存在'] = yyy # 修改
xxdf.loc['不存在'] = yyy # 新增
删除列
del xxdf['已存在列']
02.索引 - 增删查
※:索引对象不可修改
索引-查
即读取
索引-增
xxSeries.append(s) xxDataFrame.append(df) # 新增行
xxdf.insert(loc, column, value, allow_duplicate=False) # 插入位置,列名称,值,是否允许重复索引,默认不允许
索引-删
xxdf.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='rasie')
# 名称(们),0跨行1跨列,或者不用labels+axis,改用index删行,columns删列,多层索引,是否原值操作,默认返回新值,删除不存在索引会报错,可忽略报错ignore
03.算术运算与数据对齐
Series运算
Series1.add(Series2, fill_value=yyy)
DataFrame运算
df1 + df2
df1.add(df2, fill_value=yyy) # 行列都匹配才相加,某一个没有值自动填充,都没有则返回nan
xxdf.fillna(yyy) # nan填充
其他运算函数
add +
sub(subtract) -
mul(multiply) *
div(divide) /
floordiv //
mod %
04.聚合函数、apply与映射
聚合函数
numpy的各种聚合函数,通用函数都可直接操作pandas对象
xxSeries.sum()
xxDataFrame.sum(axis)
apply应用函数
可以对数据的行或列,或单值应用一个处理函数
xxSeries.apply(操作单值函数 [, args=函数参数元祖])
xxDataFrame.apply(操作单行或单列函数,axis=0/1 [, args=函数参数元祖])
映射
xxSeries.map(func) = xxSeries.apply(func)
xxDataFrame.applymap(func) # 把func作用在每个单元格的值上
05.pandas连接MySQL做查询
pip install pymysql
import pymysql
connect = pymysql.connect(host, port, user, password, db, charset) # 1.建立连接对象
cursor = connect.cursor() # 2.创建游标对象
sql = 'show tables;' # 3.组装SQL语句
cursor.execute(sql) # 4.执行SQL语句
cursor.fetchone() fetchmany(n) fetchall() # 5.查询语句,可查看结果,一条,n条,全部
cursor.close() # 6.关闭游标
connect.close() # 7.关闭连接对象
06.pandas读取与写入文件
1.读取剪切板
pd.read_clipboard(sep='\\s+', **kwargs)
2.读取csv文件
pd.read_csv('xx.csv', headers=None) # 不需要首行作为索引
pd.read_csv('xx.csv', names) # 自定义列名称
3.读取json文件
pd.read_json('xx.json')
4.读取MySQL
pd.read_sql(sql, connect, index_col=None, coerce_float=True) # 最后参数为数字列变为float
5.读取excel
import xlrd
pd.read_excel('xx.xlsx')
6.存储到csv
xx.to_csv()
xx.to_csv(path_or_buf=None, sep=',', na_rep='', columns=None, header=True, index=True, index_label=None, mode='w', encoding=None)
# path_or_buf 文件名称 na_rep 换成存储
7.存储到Excel
xx.to_excel()
xx.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', header=True, index=True, startrow=0, startcol=0, engine=None, encoding=None, inf_rep='inf')
# excel_writer 文件名称/写入对象
07.pandas排序和排名
Series 排索引
Series.sort_index(self, axis=0, level=None, ascending=Ture, inplace, kind, na_position, sort_remaining, ignore_index, key)
Series排值
Series.sort_values(self, axis=0, ascending, inplace, kind, na_position, ignore_index, key)
# axis=0‘index’ 默认升序 默认返回新值 默认不忽略索引
排名:返回名次
Series.rank(self, axis=0, method, numeric_only, na_option, ascending=True, pct)
# pct显示百分比名次
DataFrame排索引
DataFrame.sort_index(self, axis=0, level=None, ascending=True, inplace, kind, na_position, sort_remaining, ignore_index, key)
DataFrame 排值
DataFrame.sort_values(self, by, axis=0, ascending=True, inplace=True, kind, na_position='last', ignore_index, key)
# by表示按照一列还是多列去排序 axis=0即index可和by配合
自然排序库natsort
pip install natsort
08.重复值判断与汇总统计
唯一值判断
xx.is_unique # 返回bool 可判断index,Series
汇总统计
常用聚合函数:count max min sum var std mean average mode...
xx.sum(axis=None, skipna=True, level=None) # 0/index 是否跳过nan
描述性统计
xx.describe()
df.info() # Series没有info(),只有describe()
09.唯一值、值计数与数据筛选
唯一值
xx一维.is_unique # 判断是否唯一
xx一维.unique() # 取出唯一值
!值统计函数
Series.value_counts(self, normalize=False, sort=True, ascending=False, bins=None, dropna=True)
# 默认返回次数,默认降序,默认不考虑nan
pd.value_counts(values, sort=True, ascending=False, normalize=False, bins, dropna)
# values可以是Series,list tuple ndarray array_like
DataFrame值统计
df.value_counts() # 统计每行出现的次数
df.apply(pd.value_counts, axis=0) # 对df每行每列apply
Series(xxdf.values.ravel()).value_counts() # 对df整体做所有单元格值统计
pd.value_counts(xxdf.values.ravel()) # 对df整体做所有单元格值统计
数据筛选
xx.isin([xx, yy, zz]) # isin对每个值== 的判断
10.缺失值处理
缺失值怎么处理?
(1) 先理解数据集,查看数据的指标,判断 缺失数据是否对统计分析有影响
(2) 看看 缺失的数据是 数值型 还是 字符型
(3) 或者看看 缺失数据量 在 总体的占比,根据实际判断 能否 丢弃 或者填充
(4) 填充缺失数据,根据实际情况使用 0 均值 中位数 众数 等等 ,甚至复杂情况需要分组后计算再填充,防止填充值出现较大误差
(5) 还有可能取的数据源有问题,去查数据源
(6) ......
np.isnan(yy) # 返回是否是nan,处理单个或多个值
dropna()丢弃缺失值
Series.dropna(self, axis=0, inplace=False, how=None)
DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None, inplace=False)
# 默认跨行,any只要有一个nan就丢弃,all则全为nan丢弃
# thresh至少保留几个非nan值,subset=[]一列或多列,默认不在原值上操作,返回新值
fillna()填充缺失值
Series.fillna(self, value=None, method=None, axis=None, inplace=False, limit=None)
DataFrame.fillna(self, value=None, method=None, axis=None, inplace=False, limit=None)
# value固定值填充,也可字典进行匹配式填充,method有ffill/bfill
11.pandas中的字符串处理
Series类字符串处理
Series.str.contains(self, pat, case, flags, na, regex)
# 直接调用字符串函数,可结合正则
# 参数:pat字符串/正则 case区分大小写 flags匹配模式 na处理nan regex开始正则匹配模式
快速转换数据类型
xx.astype(dtype) # dtype 数据类型或{列1: 数据类型1, 列2: 数据类型2, ...}
12.pandas中的时间处理
import time
from datetime import datetime, timedelta
from dateutil.parser import parse
time.time() # 时间戳
pandas中日期对象
pd.to_datetime([timestr]) # 返回时间对象
pd.date_range(start=None, end=None, periods=None, freq=None, tz=None, noormalize=False, name=None, closed=None, **kwargs)
# 开始时间/结束时间/时间间隔/时间占位符/normalize午夜时间/名称/closed初始末尾值是否可取
13.pandas合并数据集
pd.merge(left, right, how='inner')
多列合并
相同列名称 on = ['key1', 'key2', ...]
不同列名称 left_on = ['key1', 'key2', ...]
pd.concat([a, b, c, d]) 连接数据集
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
14.索引重塑和轴向旋转
索引重塑
Series.reset_index(level=None, drop=False, name=None, inplace=False)
DataFrame.reset_index(self, level, drop=False, inplace=False, col_level=0, col_fill='')
# col_level=0 行索引变成列索引,在列索引的层级,col_fill=' ' 若列索引是多层,填充空余的层级的值
轴向旋转
xxdf.stack(level=默认最后一层, dropna=True) # 将列索引旋转到行索引
xxdf.unstack(level=默认最后一层, fill_value=None) # 将行索引旋转到列索引
15.数据去重、函数映射、替换值
数据去重
xx.duplicated() # 返回每个值是否是重复值的bool值
# 可以用 xx.unique() / xx.is_unique
Series.drop_duplicates(self, keep='first', inplace=False)
DataFrame.drop_duplicates(self, subset=None, keep='first', inplace=False, ignore_index=False)
# subset多列去重,默认所有列重复才丢弃,keep保留哪个为不重复,默认第一个,是否原值操作,是否忽略索引
函数映射
使用函数和映射以及apply对数据进行处理与转换
替换值
fillna() 填充nan
xxstr.replace()
正则替换,需要数据是字符串,可先转换为str:
xx.astype(str).replace(to_replace='\w+', value=666, regex=True)
Series.replace(self, to_replace=None, value=None, inplace=False, limit=None, regex=False, method='pad')
# self/需要替换的是啥/替换成啥/默认你非正则匹配/pad-ffill-bfill
如果是不同列换成不同值,字典内包含字典就可以
xx.replace({'列1':{被替换的:替换值}, '列2':{被替换的:替换值}})
16.数据拆分与异常值检测
数据拆分pd.cut
pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', ordered=True)
# x : 被拆分 的对象
# bins : 分箱 区间 ,可以是 int,也可以是 [ ]
# right: bool = True : 默认 每个 bins 的区间 右侧 是 闭合 的
# labels : [] ,给每个区间 取 一个 名称
# retbins: bool = False , 是否 返回 分箱 区间
# precision: int = 3 , 默认保留 3位小数
# include_lowest: bool = False , 默认是否包含分箱 的 最小值 。 默认不包含
# duplicates: str = 'raise' , 是否 丢弃 分箱 bins内 的 重复值 。默认 不丢弃。
# ordered: bool = True , 分类 是否 排序
# 返回结果是 每个值 属于 哪个 区间 的 分类 对象
pd.qcut() 根据比例划分
异常值检测
超出预设条件值,明显区别于其他数据
数据修剪 clip
xxdf.clip(-3, 3) # 大于3变成3,小于-3变成-3,返回新值
17.数据聚合与分组计算
分组计算groupby
Series.groupby(self, by=None, axis=0, level=None, dropna=True) # by分组依据
DataFrame.groupby(self, by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, dropna=True)
# level使用索引分组 as_index分组计算后分组依据作为索引
# !分组对象可直接应用聚合函数
xxgrouped.mean() xxgrouped.apply(np.mean) # 聚合函数会对每个分组对象进行计算
指定分组对象使用不同函数
xxgrouped.agg(func)
xxgrouped.agg([func1,fun2,...])
agg( [('求和','sum') ,('平均值','mean'),... ] )
# 让函数显示一个别名
agg({列1:['sum','mean','max'], 列2:[('求和','sum'), ('平均值', 'mean')]})
# 让 不同的 数列 列 应用不同的 聚合函数
18.分组、apply、透视表
透视表
DataFrame.pivot_table(self, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='ALL', ovserved=False)
pd.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False)
# values : 透视的数据们
# index=None, 哪些列作为行索引
# columns=None, 哪些列作为 列索引
# aggfunc='mean' 默认求的 均值 ,可以传入 list ,算多个聚合值 ,也可以 dict margins=False ,分项小计
# margins_name='All' ,分项小计显示名称