总 结
1Series对象:一维数组,有index和value构成
S1 = pd.Series([88,98,75])
1.1设置索引:
s1 = pd.Series(data=[88,98,75],
index=['张三','李四','王五'])
1.2通过索引号、索引名获取值:
s1[['张三','李四']]
1.3通过索引号(左闭右开)
s1[0:1]
1.4索引名切片获取值(左闭又闭)
s1['张三':'李四']
1.5series属性
series.index
series.values
series.hasnans 判断是否为空
2DataFrames:表单由行列构成,二位数组
2.1数据结构:由index,columns,values三个组件构成
DataFrame对象是Series对象的集合
行索引:序号
列索引:表头
data = [[110, 105, 99],
[105, 88, 115],
[109, 120, 130]]
index = [0, 1, 2] # 行索引
columns = ['语文', '数学', '英语'] # 列索引
df = pd.DataFrame(
data = data,
index = index,
columns =columns
)
2.2DataFrame属性
2.2.1df.values
2.2.2去重: unique
df['语文'].unique
2.2.3去重后计数:nunique
df['语文'].nunique
2.2.4行列转置 T
2.2.5查看前几条数据head
2.2.6查看后几条数据tail
2.2.7查看形状
2.2.8查看列表基本信息info
2.3常用函数
2.3.1 describe(): 查看每列描述统计信息
2.3.2 sum、max、min、mean、median、var、std
2.3.3 返回最大值的索引号 argmax
2.3.4 返回最大值的索引名 idxmax
2.3.5 返回最小值的索引号 argmin
2.3.6 返回最小值的索引名 idxmin
2.3.7 isnull、notnull
3数据读取
3.1读取excel:read_excel
df = pd.read_excel('./data/demo_03.xlsx')
3.2读取excel:read_csv
pd.read_csv('./data/demo_03.txt', encoding='utf-8', sep='\t')
3.3读取excel:read_json
json:非表单结构,读取无意义
json:表单结构(split, records, index, table, values),读取有意义
pd.read_json('./data/records.json', orient='records')
4数据抽取
data = [[109, 107, 100],
[105, 114, 135],
[98, 88, 120],
[145, 150, 130]]
name = ['刘备', '关羽', '张飞', '诸葛亮']
columns = ['语文', '数学', '英语']
df = pd.DataFrame(
data=data,
index=name,
columns=columns)
4.1使用loc方法抽取
df.loc['刘备']
4.2使用iloc方法抽取
df.iloc[[0, 2]]
4.3使用切片抽取
df.loc['刘备':'诸葛亮']
df.iloc[0:4]
4.4条件抽取:&、|、~
语文大于105且数学大于88
df.loc[(df['语文'] > 105) & (df['数学'] > 88)]
5数据增删改
5.1增:
5.1.1 直接复制
df['物理'] = [88, 79, 60, 50]
5.1.2 loc方法
df.loc[:, '物理'] = [88, 79, 60, 60]
5.1.3insert
df.insert(1, '物理', [88, 79, 60, 50])
5.1.4 append
df.append(df2)
5.2改
5.2.1修改列索引
1.1.1.1.1通过属性赋值
df.columns = ['语文', '物理(上)', '数学', '英语']
1.1.1.1.1通过rename方法
df.rename(
columns={'语文': '语文(上)',
'英语': '英语(上)'},
inplace=True)
df
5.2.2修改行索引
5.2.3修改整行数据
df.loc['张飞'] = [120, 115, 109, 105]
5.2.4修改整列数据
df.loc[:, '语文'] = [115, 108, 112, 118, 115]
5.2.5修改张飞的各科成绩
df.loc['张飞'] = df.loc['张飞'] + 10
5.2.6修改张飞的语文成绩
df.loc['张飞', '语文'] = 115
5.2.7修改第1行第1列数据
df.iloc[0, 0] = 115
5.2.8修改整列数据,第1列
df.iloc[:, 0] = [115, 108, 112, 118, 120]
5.2.9修改整行数据,第1行
df.iloc[0, :] = [120, 115, 109, 125]
5.3删
5.3.1删除列数据
df.drop(columns='数学', inplace=True)
5.3.2删除行数据
df.drop(index='张飞', inplace=True)
5.3.3删除指定条件的行
删除“物理”等于50或79的行
index = df[df['物理'].isin([50, 79])].index
df.drop(index=index, inplace=True)
5.3.4删除“语文”小于120的行
index = df[df['语文'] < 120].index
df.drop(index=index, inplace=True)
6数据清洗
数据:df = pd.read_excel('./data/demo_06.xlsx',sheet_name='Sheet1')
6.1查看字段信息: info df.info()
6.2查看每列的空值数量:df.isnull().sum()
6.3查看每列是否存在空值:df.isnull().any()
6.4处理缺失值:mean,median,mode
填充:fillna
6.5删除缺失值
dropna
6.6处理重复值
6.6.1判断每行是否完全重复:duplicated
6.6.2删除正航完全重复的数据:drop_duplicates
6.6.3删除指定列的重复数据
6.7数据筛选
6.7.1query方法筛选
and、or、not、&、|、~
数值筛选:df.query('产品数量 >= 2')
文本筛选:df.query('类别 == "优选"')
时间段筛选:between_time
6.8数据清洗
6.8.1分列:split
df[['性别','年龄']] = df['用户信息'].str.split(',',expand=True)
6.8.2合并:cat 或者 “+”
df['性别'].str.cat(df['年龄'],sep=",")
df['基本信息'] = df['性别'] + ',' + df['年龄']
6.8.3内容替换: replace
df['交易金额'].str.replace('元','')
6.8.4信息提取:extract
df['联系方式'].str.extract(pat="(\d{11})",expand=True)
6.8.5爆炸序列:explode,一行拆分成多行
6.8.6文本聚合:多行合并成一行
tb.groupby('用户ID', as_index=False).agg(lambda x: ','.join(x))
6.8.7索引设置
series重置索引:reindex
DataFrame重置索引:reindex
reindex:对索引重新赋值
set_index:设置某列为索引
reset_index: 重置索引从0开始
6.8.8排序sort_values
rank
7数据统计
sum、mean、max、min、median、mode、var、std、quantile
8数据格式化
8.1设置小数位数:round
8.2设置百分比:
apply(单列) df['A'].apply(lambda x: '{:.0%}'.format(x))
applymap(多列) df[['A', 'B', 'C']].applymap(lambda x:
'{:.2%}'.format(x))
map(单列) df['A'].map(lambda x: '{:.2%}'.format(x))
8.3设置千位分隔符
df[['A', 'B', 'C']].applymap(lambda x: '{:,}'.format(x))
9分组聚合groupby
9.1一列分组一列聚合
df.groupby('一级分类', as_index=False)['数量'].sum()
# df.groupby('一级分类')['数量'].sum().reset_index()
# df.groupby('一级分类')['数量'].sum().to_frame()
9.2多列分组多列聚合
df.groupby(['一级分类','二级分类'])[['数量','金额']].sum()
9.3groupby+agg
9.3.1指定列使用多个聚合函数
df.groupby('一级分类')[['数量','金额']].agg(['mean','sum'])
9.3.2指定类使用指定聚合函数:
df.groupby('一级分类').agg({'数量':'mean','金额':'sum'})
9.3.3聚合后重命名:
df.groupby('一级分类').agg(数量_均值=('数量','mean'),数量_求和=('数量','sum'))
9.4groupby+transform 将聚合后数值关联至原表
tb = df.groupby(['大区','省份'])['金额'].sum().reset_index()
tb1 = tb.groupby('大区')['金额'].transform('sum')
9.5gruopby+字典+聚合函数:对行进行聚合
tb.groupby(dict, axis=1).sum().reset_index()
10数据透视表: pivot_table
# data:DataFrame对象
# values:Excel透视表的值
# index:Excel透视表的行
# columns:Excel透视表的列
# aggfunc:Excel透视表的计算类型
# fill_value:填充空值
# margins:是否显示合计
# dropna:是否删除缺失行(如整行缺失)
# margins_name:合计的别名
# df.pivot_table()
pd.pivot_table(
data=df,
index=['大区', '省份'],
columns='一级分类',
values=['数量', '金额'],
aggfunc={'数量': 'sum', '金额': 'mean'},
margins=True,
margins_name='总计',
fill_value=0,
)
11数据透视表: crosstab (可以统计百分比)
# index: 行索引,Series对象
# columns: 列索引,Series对象
# values: 聚合字段,Series对象
# rownames: 行索引的别名
# colnames: 列索引的别名
# aggfunc: 聚合函数
# margins: 是否显示合计
# margins_name: 合计的别名
# dropna: 是否删除缺失行(如整行缺失)
# normalize: Excel透视表“值显示方式”
# normalize=True,总计百分比
# normalize='all',总计百分比
# normalize='index',行汇总百分比
# normalize='columns',列汇总百分比
pd.crosstab(
index=df['大区'],
columns=df['一级分类'],
values=df['数量'],
aggfunc='sum',
margins_name='总计',
normalize='columns'
)
12数据偏移
12.1shift函数
tb['上期销量'] = tb['销量'].shift(periods=1, freq='D', fill_value=0)
12.2diff函数 : 偏移后计算差异
12.3pct_change函数: 偏移后计算差异百分比
12.4rolling函数
滚动计算,计算近3天平均销量
13数据切分
13.1cut:等距分组
tb['等距分箱'] = pd.cut(x=tb['成绩'], bins=10, right=False)
13.2qcut函数:指定分位数,等频分箱
14数据透视pivot,字段里的值转换为新的字段
tb = df.pivot(index='门店', columns='品类', values='销量')
15逆透视melt,列转行里的字段
pd.melt(
frame=df, # df对象
# 位置保持不变的字段
id_vars='门店',
# 列转为行的字段
value_vars=['手机', '电脑'],
# 列转为行后,新字段的别名
var_name='品类',
# 值列的别名
value_name='销量')
16数据合并:
16.1merge(横向合并)
左连接:pd.merge(df1, df2, how='left', left_on='工号', right_on='编号')
右链接right
外连接outer
内连接inner
交叉连接cross,笛卡尔积连接
16.2join(横向合并)(和merge类似,少了个交叉连接)
# 将两表的关联字段设置为行索引
df1.set_index('工号', inplace=True)
df2.set_index('编号', inplace=True)
df1.join(df2, how='left')
16.3concat(横向、纵向合并)
# 将两表的关联字段设置为行索引
df1.set_index('工号', inplace=True)
df2.set_index('编号', inplace=True)
pd.concat(objs=[df1, df2], axis=1, join='outer')
pd.concat(objs=[df1, df2], axis=1, join='inner')
17数据导出
17.1导出Excel
17.2导出CSV
17.3导出Txt
17.4导出Json
17.5导出数据库
18日期处理与采集
18.1解析日期 to_datetime
18.2提取日期信息
df['订单日期'] = pd.to_datetime(df['订单日期'])
df['年'] = df['订单日期'].dt.year
df['月'] = df['订单日期'].dt.month
df['日'] = df['订单日期'].dt.day
df['星期几'] = df['订单日期'].dt.day_name()
df['季度'] = df['订单日期'].dt.quarter
df['是否年底'] = df['订单日期'].dt.is_year_end
18.3重采样
针对日期字段分组聚合的快捷方式
重采样:升采样,降采样
升采样:低频率到高频率采样
降采样:高频率到低频率采样
tb.resample('M')['销售额'].sum().to_period('M').to_frame()
类似于:
tb.resample('M').agg({'数量': 'sum', '销售额': 'mean'}).to_period('M')
18.4日期切片操作:
# 必须设置日期为索引,排序后再切片
tb = tb.sort_index()
tb['2020-01-01':'2020-01-05']
18.5sample随机抽样
19时间序列
19.1生成时间序列
pd.date_range(start='2021-01-01', end='2021-01-31', freq='5D')
19.2 时间序列加减
df['日期加10天'] = df['日期'] + pd.DateOffset(days=10)
19.3实例化日期 Timestamp