【第七周:Python(二)】7周成为数据分析师

本课程共七个章节,课程地址:7周成为数据分析师(完结)_哔哩哔哩_bilibili

  1. 数据分析思维
  2. 业务知识
  3. Excel
  4. 数据可视化
  5. SQL
  6. 统计学
  7. Python

第七周:Python(P86-P143) 

  1. Python的数据科学环境(P86)
  2. Python基础(P87-P97)
  3. 数据分析常用包:Numpy和Pandas(P98-P112)
  4. Python连接数据库(P113-P114)
  5. 数据分析案例(P115-P124)
  6. 数据可视化:Matplotlib和Seaborn(P125-P138)
  7. 数据分析平台(P139-P143)

目录(P103-P112)

第七周:Python(P86-P143) 

三、数据分析常用包:Numpy和Pandas(P98-P112)

(四)pandas高阶(P103开始)

(五)pandas筛选 

(六)pandas聚合(类似SQL中的group by)

(七)pandas多表关联 

(八)pandas多重索引

(九)pandas预处理函数

(十)pandas  apply

(十一)pandas 数据透视


三、数据分析常用包:Numpy和Pandas(P98-P112)

(四)pandas高阶(P103开始)

1. 读csv文件 

import pandas as pd

# sep="\t"表示分隔符为\t,默认为,
# names=list("abcdefg")表示列名设置为abcdefg,此时原本的列名会变成第一行数据

df = pd.read_csv("dataAnalyst.csv", encoding="gbk", sep="\t", names=list("abcdefg"))
df

【第七周:Python(二)】7周成为数据分析师_第1张图片

  • 若只想预览前n行数据:
df.head(n)   # n默认为5
  • 若只想预览最后n行数据:
df.tail(n)   # n默认为5

2. 更改某一列的数据类型

  • 如把 top列 的数据类型从 int64 改为object(字符串)
df.top = df.top.astype('str')

3. 增加一列

df['avg_2'] = (df.bottom + df.top)/2

4. 查找符合要求的数据

  • 平均薪资 > 15的那些岗位所在的城市
df.query('avg>15').city
  • 平均薪资 > 15且在上海的岗位
df[(df.city=="上海")&(df.avg>15)]

5. 行列转置

df.T

【第七周:Python(二)】7周成为数据分析师_第2张图片


(五)pandas筛选 

1. 排序 

  • 按值进行排序 
# 根据平均薪资排序(默认升序)
df.sort_values(by='avg')

# 写法2
df.avg.sort_values()

# 降序
df.sort_values(by='avg', ascending=False)

# 多条件排序
df.sort_values(['avg','city'], ascending=False)
  • 按索引进行排序
df.sort_index()
  • 排名
df['rank'] = df.avg.rank(ascending=False)  # 降序后,avg越高,rank越前,符合正常认知
df
【第七周:Python(二)】7周成为数据分析师_第3张图片 method参数默认值为 average
df['rank'] = df.avg.rank(ascending=False,method='min')
df

【第七周:Python(二)】7周成为数据分析师_第4张图片

method还有 max、first(不考虑并列情况,值一样时按index排序)等 

2. 重复值检测

  • 查看总共有多少个唯一值 
df.city.unique()

  • 对唯一值出现次数进行计数 
df.workYear.value_counts()

【第七周:Python(二)】7周成为数据分析师_第5张图片

3. 描述性统计

df.describe()

【第七周:Python(二)】7周成为数据分析师_第6张图片

  • 只想对某一列做描述性统计 
df.avg.describe()
  • 直接对 DataFrame 进行 count、max、min、sum、mean、median、std(标准差)、var(方差) 等也可以 
df.count()

4. 累加

df['cumsum'] = df.avg.cumsum()

【第七周:Python(二)】7周成为数据分析师_第7张图片

5. 分桶(必须是pd.cut(),而不是df.cut()) 

  • 均匀分
df['bins'] = pd.cut(df.avg, bins=4, labels=list('abcd'),include_lowest=True)  # 把avg均匀地四等分

【第七周:Python(二)】7周成为数据分析师_第8张图片

  • 人工划分区间 
df['bins'] = pd.cut(df.avg, bins=[0,5,10,20,30,100],labels=['0-5','5-10','10-20','20-30','30-100'])  

【第七周:Python(二)】7周成为数据分析师_第9张图片

  • pd.qcut()     按分位数划分 

(六)pandas聚合(类似SQL中的group by)

df.groupby(by = 'city').count()   # count()不对空值进行计数

1. 单字段聚合

  • 统计不同城市平均薪资的最大值
df.groupby(by='city').avg.max()

【第七周:Python(二)】7周成为数据分析师_第10张图片

  •  统计每个城市有多少元素
for k in df.groupby(by='city'):
    print(k[0],len(k[1]))

【第七周:Python(二)】7周成为数据分析师_第11张图片

  • 统计不同城市最大薪资与最小薪资的差值 
for k,v in df.groupby(by='city'):   # k为city,v为每个city下的DataFrame
    print(k,max(v.avg)-min(v.avg))

【第七周:Python(二)】7周成为数据分析师_第12张图片  

2. 多字段聚合(多重索引) 

  • 不同城市下不同工作年限的平均薪资的平均值
df.groupby(by=['city','workYear']).mean()

【第七周:Python(二)】7周成为数据分析师_第13张图片


(七)pandas多表关联 

两张表:position_gbk.csv 和 company_utf.csv

【第七周:Python(二)】7周成为数据分析师_第14张图片 position_gbk.csv 【第七周:Python(二)】7周成为数据分析师_第15张图片 company_utf.csv

pandas里有三种关联的方法:

  • concat:字段全部合并,数据全部堆叠,没有默认为NaN(类似于SQL中的union)
  • join:根据索引
  • merge:根据具体某一列

1. merge()

position.merge(right=company, how='inner', on='companyId')

df.merge(right= , how= , on= , left_on= , right_on= )

  • right:要和哪张表关联
  • how:关联方式(inner默认、left、right)
  • on:具体通过哪几列进行join(会自动只保留一列)
  • left_on & right_on:两张表没有共同字段,连接两表时,左表的字段名和右表的字段名(都会保留)

更改字段名称:

  • rename()
  • columns()

将 company 表的 companyId 改为 id:

col = list(company.columns)
col[0] = 'id'
company.columns = col

此时联立两表:

position.merge(right=company, how='inner', left_on='companyId', right_on='id')

注:若是 pd.merge(),pd.merge(left=, right= , how= , on= , left_on= , right_on= )

2. join()

company.join(position)

3. concat()

pd.concat([company,position])  # 上下拼接

pd.concat([company,position],axis=1)    # 左右拼接

【第七周:Python(二)】7周成为数据分析师_第16张图片

应用场景:所有月份的销售明细(字段相同)拼接 


(八)pandas多重索引

position = pd.read_csv('position_gbk.csv',encoding='gbk')

position.groupby(by = ['city','education']).mean()

【第七周:Python(二)】7周成为数据分析师_第17张图片

position.groupby(by = ['city','education']).mean().reset_index()

【第七周:Python(二)】7周成为数据分析师_第18张图片

1. Series格式的索引

【第七周:Python(二)】7周成为数据分析师_第19张图片

2. DataFrame格式的索引

【第七周:Python(二)】7周成为数据分析师_第20张图片

3. 不借助 group by 怎么设置多重索引?

position.sort_values(by=['city','education']).set_index(['city','education'])

【第七周:Python(二)】7周成为数据分析师_第21张图片


(九)pandas预处理函数

1. 文本函数

position = pd.read_csv('position_gbk.csv',encoding='gbk')

position.positionLables.str.count('分析师')   # 统计“分析师”出现次数

position.positionLables.str.find('数据')  # “数据”一词的出现位置,-1表示未出现

【第七周:Python(二)】7周成为数据分析师_第22张图片

去掉外面的 [ ]:

position.positionLables.str[1:-1]

再去掉双引号:

position.positionLables.str[1:-1].str.replace("'","")

【第七周:Python(二)】7周成为数据分析师_第23张图片

2. 空值 

import numpy as np

position = pd.read_csv('position_gbk.csv',encoding='gbk')
position.loc[position.city == '深圳','city'] = np.NaN  # 把“深圳”全部替换为NaN

对空值进行填充:

position = position.fillna('abc')

# 写法2
position.city = position.city.fillna('abc')

删除NaN:

position.dropna()  # 删除所有有空值的行

position.dropna(axis=1)  # 删除所有有空值的列

3. 重复值

  • 过滤出重复数据 
position[position.duplicated()]

【第七周:Python(二)】7周成为数据分析师_第24张图片

  • 删除重复数据 
s.drop_duplicates()

【第七周:Python(二)】7周成为数据分析师_第25张图片


(十)pandas  apply

  • 把一个自定义函数应用到所有行/列中
  • 既可以针对Series,又可以针对DataFrame

1. 在 avg 列后面加上 k

position.avg.astype('str') + 'k'

# 写法2:
position.avg.apply(lambda x:str(x)+'k')   # 匿名函数

# 写法3:
def func(x):
    return str(x)+'k'
position.avg.apply(func)

position.apply(func, axis=)

  • axis=0:应用函数对所有列
  • axis=1:应用函数对所有行

2. 将 avg 列根据 20 划分档次

def func():
    if x.avg>20:
        return '20+k'
    else:
        return '0-20k'
    
positon.apply(func, axis=1)  # 逐行

# 写法2
def func(x):
    if x>20:
        return '20+k'
    else:
        return '0-20k'

position.apply(lambda x:func(x.avg), axis=1)

【第七周:Python(二)】7周成为数据分析师_第26张图片

3. 将 avg 列平方

position.avg.apply(lambda x:x*x)

4. apply与聚合函数

注:position.groupby('city') 之后,每个 city 都形成一个DataFrame 

position.sort_values('avg',ascending=False)[:5]    # 降序

【第七周:Python(二)】7周成为数据分析师_第27张图片

求出不同城市下薪资排名前五的岗位:

def func(x):
    r = x.sort_values('avg', ascending=False)
    return r[:5]

position.groupby('city').apply(func)

【第七周:Python(二)】7周成为数据分析师_第28张图片

求出不同城市下薪资排名前n的岗位:

def func(x,n):
    r = x.sort_values('avg', ascending=False)
    return r[:n]

position.groupby('city').apply(func,n=3)

【第七周:Python(二)】7周成为数据分析师_第29张图片

变为升序:

def func(x,n, asc=False):
    r = x.sort_values('avg', ascending=asc)
    return r[:n]

position.groupby('city').apply(func,n=3,asc=True)

【第七周:Python(二)】7周成为数据分析师_第30张图片

5. agg()函数(不涉及形状变化) 

position.groupby('city').agg(sum)

# 平均值是 .agg('mean'),等价于 .mean()

# 也可以同时运用多个函数  .agg(['sum','mean'])

# 也可以使用自定义函数  .agg(lambda x:max(x)-min(x))

【第七周:Python(二)】7周成为数据分析师_第31张图片


(十一)pandas 数据透视

position.pivot_table(values= , index= , columns= , aggfunc= , fill value= , margins= , dropna= )

  • aggfunc 默认为 'mean'
  • margins 默认为 False,即在下面加一个汇总项
  • dropna 默认为 True,即砍掉空值
position.pivot_table(index='city', columns='workYear', values='avg')

# 支持多重索引,如:index=['city','education'],values=['top','avg']

【第七周:Python(二)】7周成为数据分析师_第32张图片

position.pivot_table(index = ['city','education'],
                    columns = 'workYear',
                    values = ['top','avg'],
                    aggfunc = [np.mean, np.sum])

【第七周:Python(二)】7周成为数据分析师_第33张图片

对上表可以进行不断地切片:

position.pivot_table(index = ['city','education'],
                    columns = 'workYear',
                    values = ['top','avg'],
                    aggfunc = [np.mean, np.sum])['mean']['avg'].loc['上海']

【第七周:Python(二)】7周成为数据分析师_第34张图片

对 avg 求平均,对 top 求和:

position.pivot_table(index = ['city','education'],
                    columns = 'workYear',
                    values = ['top','avg'],
                    aggfunc = {'avg':np.mean,'top':np.sum})  # 字典的形式

【第七周:Python(二)】7周成为数据分析师_第35张图片

输出为csv:

.reset_index().to_csv('test.csv')

你可能感兴趣的:(数据分析,pandas,数据分析)