本课程共七个章节,课程地址:7周成为数据分析师(完结)_哔哩哔哩_bilibili
目录(P103-P112)
第七周:Python(P86-P143)
三、数据分析常用包:Numpy和Pandas(P98-P112)
(四)pandas高阶(P103开始)
(五)pandas筛选
(六)pandas聚合(类似SQL中的group by)
(七)pandas多表关联
(八)pandas多重索引
(九)pandas预处理函数
(十)pandas apply
(十一)pandas 数据透视
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
df.head(n) # n默认为5
df.tail(n) # n默认为5
2. 更改某一列的数据类型
df.top = df.top.astype('str')
3. 增加一列
df['avg_2'] = (df.bottom + df.top)/2
4. 查找符合要求的数据
df.query('avg>15').city
df[(df.city=="上海")&(df.avg>15)]
5. 行列转置
df.T
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
method参数默认值为 average
df['rank'] = df.avg.rank(ascending=False,method='min')
df
method还有 max、first(不考虑并列情况,值一样时按index排序)等
2. 重复值检测
df.city.unique()
df.workYear.value_counts()
3. 描述性统计
df.describe()
df.avg.describe()
df.count()
4. 累加
df['cumsum'] = df.avg.cumsum()
5. 分桶(必须是pd.cut(),而不是df.cut())
df['bins'] = pd.cut(df.avg, bins=4, labels=list('abcd'),include_lowest=True) # 把avg均匀地四等分
df['bins'] = pd.cut(df.avg, bins=[0,5,10,20,30,100],labels=['0-5','5-10','10-20','20-30','30-100'])
df.groupby(by = 'city').count() # count()不对空值进行计数
1. 单字段聚合
df.groupby(by='city').avg.max()
for k in df.groupby(by='city'):
print(k[0],len(k[1]))
for k,v in df.groupby(by='city'): # k为city,v为每个city下的DataFrame
print(k,max(v.avg)-min(v.avg))
2. 多字段聚合(多重索引)
df.groupby(by=['city','workYear']).mean()
两张表:position_gbk.csv 和 company_utf.csv
position_gbk.csv company_utf.csvpandas里有三种关联的方法:
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:两张表没有共同字段,连接两表时,左表的字段名和右表的字段名(都会保留)
更改字段名称:
将 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) # 左右拼接
应用场景:所有月份的销售明细(字段相同)拼接
position = pd.read_csv('position_gbk.csv',encoding='gbk')
position.groupby(by = ['city','education']).mean()
position.groupby(by = ['city','education']).mean().reset_index()
1. Series格式的索引
2. DataFrame格式的索引
3. 不借助 group by 怎么设置多重索引?
position.sort_values(by=['city','education']).set_index(['city','education'])
1. 文本函数
position = pd.read_csv('position_gbk.csv',encoding='gbk')
position.positionLables.str.count('分析师') # 统计“分析师”出现次数
position.positionLables.str.find('数据') # “数据”一词的出现位置,-1表示未出现
去掉外面的 [ ]:
position.positionLables.str[1:-1]
再去掉双引号:
position.positionLables.str[1:-1].str.replace("'","")
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()]
s.drop_duplicates()
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=)
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)
3. 将 avg 列平方
position.avg.apply(lambda x:x*x)
4. apply与聚合函数
注:position.groupby('city') 之后,每个 city 都形成一个DataFrame
position.sort_values('avg',ascending=False)[:5] # 降序
求出不同城市下薪资排名前五的岗位:
def func(x):
r = x.sort_values('avg', ascending=False)
return r[:5]
position.groupby('city').apply(func)
求出不同城市下薪资排名前n的岗位:
def func(x,n):
r = x.sort_values('avg', ascending=False)
return r[:n]
position.groupby('city').apply(func,n=3)
变为升序:
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)
5. agg()函数(不涉及形状变化)
position.groupby('city').agg(sum)
# 平均值是 .agg('mean'),等价于 .mean()
# 也可以同时运用多个函数 .agg(['sum','mean'])
# 也可以使用自定义函数 .agg(lambda x:max(x)-min(x))
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']
position.pivot_table(index = ['city','education'],
columns = 'workYear',
values = ['top','avg'],
aggfunc = [np.mean, np.sum])
对上表可以进行不断地切片:
position.pivot_table(index = ['city','education'],
columns = 'workYear',
values = ['top','avg'],
aggfunc = [np.mean, np.sum])['mean']['avg'].loc['上海']
对 avg 求平均,对 top 求和:
position.pivot_table(index = ['city','education'],
columns = 'workYear',
values = ['top','avg'],
aggfunc = {'avg':np.mean,'top':np.sum}) # 字典的形式
输出为csv:
.reset_index().to_csv('test.csv')