Pandas要点

总  结

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

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值