数据预处理


title: 数据预处理
category: 数据分析基础

Dataframe 的数据预处理

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['STFangsong']
plt.rcParams['axes.unicode_minus'] = False
%config InlineBackend.figure_format = 'svg'
  1. 加载数据

    • read_csv
    • read_excel
    • read_sql
  2. 数据抽取

    • 布尔索引
    • query
    • drop
  3. 数据清洗

    • 缺失值:isnullisnadropnafillna
    • 重复值:duplicateddrop_duplicatesnunique
    • 异常值:replacedrop
      • Z-score
      • IQR
      • DBScan
      • Isolation Forest
    • 预处理:applytransformapplymap
      • str:extract(regexp)contains
      • dt:yearquartermonthdayweekday
      • to_datetime
      • cut(data,bins)qcut(data,[0,0.1,0.25,0.5,0.75,0.9,1])
  4. 数据透视

    • 分组:groupby --> agg
    • 透视表:pivot_table --> indexcolumnsvaluesaggfunc
    • 交叉表:crosstab
    • 排序:sort_values(by,ascending)sort_index(level)
    • 取头部:nlargestnsmallest
  5. 可视化

    • 绘图:plot
      • kind:linescatterpiebarbarhhistboxplot
      • figsize
  6. 业务洞察

数据分析师岗位信息数据预处理

导入数据

df = pd.read_csv('../files/data/lagou.csv',
                 usecols=['city', 'companyFullName', 'companyLabelList', 'companySize', 'district', 
             'education', 'financeStage', 'industryField', 'positionName', 'salary',
             'workYear'])
df
citycompanyFullNamecompanyLabelListcompanySizedistricteducationfinanceStageindustryFieldpositionNamesalaryworkYear
0北京达疆网络科技(上海)有限公司['年底双薪', '绩效奖金', '岗位晋升', '定期体检']2000人以上大兴区本科D轮及以上消费生活数据分析岗15k-30k3-5年
1北京北京音娱时光科技有限公司['年底双薪', '绩效奖金', '带薪年假', '免费健身']50-150人海淀区本科A轮移动互联网数据分析10k-18k1-3年
2北京北京千喜鹤餐饮管理有限公司[]2000人以上海淀区本科未融资消费生活数据分析20k-30k3-5年
3北京吉林省海生电子商务有限公司[]少于15人朝阳区本科不需要融资电商数据分析33k-50k3-5年
4北京韦博网讯科技(北京)有限公司[]50-150人朝阳区本科未融资电商,软件开发数据分析10k-15k1-3年
....................................
3135天津清博津商(天津)教育科技有限公司[]15-50人和平区不限不需要融资数据服务,教育审核实习生(春节短期)1k-2k应届毕业生
3136天津上海礼紫股权投资基金管理有限公司[]500-2000人河北区不限未融资金融运营助理6k-8k不限
3137天津北京达佳互联信息技术有限公司['股票期权', '弹性工作', '定期体检', '岗位晋升']2000人以上西青区本科D轮及以上文娱丨内容运营编辑团队leader8k-15k3-5年
3138天津北京河狸家信息技术有限公司['高配福利', '弹性时间', 'BAT¥', '逗逼伙伴']500-2000人和平区不限C轮移动互联网商家运营-天津6k-8k不限
3139天津北京河狸家信息技术有限公司['高配福利', '弹性时间', 'BAT¥', '逗逼伙伴']500-2000人和平区本科C轮移动互联网运营实习生-天津2k-4k应届毕业生

3140 rows × 11 columns

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3140 entries, 0 to 3139
Data columns (total 11 columns):
 #   Column            Non-Null Count  Dtype 
---  ------            --------------  ----- 
 0   city              3140 non-null   object
 1   companyFullName   3140 non-null   object
 2   companyLabelList  3140 non-null   object
 3   companySize       3140 non-null   object
 4   district          3133 non-null   object
 5   education         3140 non-null   object
 6   financeStage      3140 non-null   object
 7   industryField     3140 non-null   object
 8   positionName      3140 non-null   object
 9   salary            3140 non-null   object
 10  workYear          3140 non-null   object
dtypes: object(11)
memory usage: 270.0+ KB

筛选出数据分析岗位

# 将df['positionName']处理成字符串后使用str.contains('数据分析')查找到包含数据分析关键字的岗位(返回布尔值)后使用布尔索引
temp_df = df[df['positionName'].str.contains('数据分析')]

将薪资处理成上下限的均值

# 捕获组捕获薪资上下限
# str.extract(正则表达式) - 抽取正则表达式捕获组目标值
avg_salary = temp_df.salary.str.extract(r'(\d+)[Kk]?-(\d+)[Kk]').applymap(int).mean(axis = 1)
temp_df['salary'] = avg_salary
temp_df
C:\Users\zs\AppData\Local\Temp/ipykernel_12772/422559916.py:4: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  temp_df['salary'] = avg_salary
citycompanyFullNamecompanyLabelListcompanySizedistricteducationfinanceStageindustryFieldpositionNamesalaryworkYear
0北京达疆网络科技(上海)有限公司['年底双薪', '绩效奖金', '岗位晋升', '定期体检']2000人以上大兴区本科D轮及以上消费生活数据分析岗22.53-5年
1北京北京音娱时光科技有限公司['年底双薪', '绩效奖金', '带薪年假', '免费健身']50-150人海淀区本科A轮移动互联网数据分析14.01-3年
2北京北京千喜鹤餐饮管理有限公司[]2000人以上海淀区本科未融资消费生活数据分析25.03-5年
3北京吉林省海生电子商务有限公司[]少于15人朝阳区本科不需要融资电商数据分析41.53-5年
4北京韦博网讯科技(北京)有限公司[]50-150人朝阳区本科未融资电商,软件开发数据分析12.51-3年
....................................
3065天津北京达佳互联信息技术有限公司['股票期权', '弹性工作', '定期体检', '岗位晋升']2000人以上西青区本科D轮及以上文娱丨内容数据分析专员9.01-3年
3069天津林之尚沃(天津)国际贸易有限公司[]15-50人和平区本科不需要融资医疗丨健康数据分析专员8.01-3年
3070天津林之尚沃(天津)国际贸易有限公司[]15-50人和平区本科不需要融资医疗丨健康数据分析实习生3.0不限
3071天津西安格蒂电力有限公司['技能培训', '带薪年假', '绩效奖金', '岗位晋升']500-2000人河北区大专未融资企业服务ETL/大数据/数据分析/实施9.03-5年
3088天津谷川联行有限公司['年底双薪', '技能培训', '带薪年假', '绩效奖金']150-500人西青区本科不需要融资软件开发,企业服务BI工程师/数据分析师(天津)10.0不限

1515 rows × 11 columns

将工作经验改为最低要求

# 使用正则表达式将工作经验改为最低要求
import re

def work_experience(content):
    matcher = re.search(r'\d+',content)
    result = matcher.group() if matcher else '0'
    return int(result)

temp_df['workYear'] = temp_df.workYear.apply(work_experience)
temp_df
# apply - 作用在某行/某列  applymap - 作用在每个单元格
C:\Users\zs\AppData\Local\Temp/ipykernel_12772/490244383.py:9: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  temp_df['workYear'] = temp_df.workYear.apply(work_experience)
citycompanyFullNamecompanyLabelListcompanySizedistricteducationfinanceStageindustryFieldpositionNamesalaryworkYear
0北京达疆网络科技(上海)有限公司['年底双薪', '绩效奖金', '岗位晋升', '定期体检']2000人以上大兴区本科D轮及以上消费生活数据分析岗22.53
1北京北京音娱时光科技有限公司['年底双薪', '绩效奖金', '带薪年假', '免费健身']50-150人海淀区本科A轮移动互联网数据分析14.01
2北京北京千喜鹤餐饮管理有限公司[]2000人以上海淀区本科未融资消费生活数据分析25.03
3北京吉林省海生电子商务有限公司[]少于15人朝阳区本科不需要融资电商数据分析41.53
4北京韦博网讯科技(北京)有限公司[]50-150人朝阳区本科未融资电商,软件开发数据分析12.51
....................................
3065天津北京达佳互联信息技术有限公司['股票期权', '弹性工作', '定期体检', '岗位晋升']2000人以上西青区本科D轮及以上文娱丨内容数据分析专员9.01
3069天津林之尚沃(天津)国际贸易有限公司[]15-50人和平区本科不需要融资医疗丨健康数据分析专员8.01
3070天津林之尚沃(天津)国际贸易有限公司[]15-50人和平区本科不需要融资医疗丨健康数据分析实习生3.00
3071天津西安格蒂电力有限公司['技能培训', '带薪年假', '绩效奖金', '岗位晋升']500-2000人河北区大专未融资企业服务ETL/大数据/数据分析/实施9.03
3088天津谷川联行有限公司['年底双薪', '技能培训', '带薪年假', '绩效奖金']150-500人西青区本科不需要融资软件开发,企业服务BI工程师/数据分析师(天津)10.00

1515 rows × 11 columns

图表绘制

# 1. 找出各大城市(city)数据分析岗位的需求量并绘制柱状图。
temp_ser = temp_df.groupby('city').positionName.count()
temp_ser.plot(kind = 'bar',figsize = (8,4),color = '#98C3A1')
plt.xticks(rotation = 0)
plt.yticks(np.arange(50,551,100))
plt.xlabel('城市')
plt.ylabel('招聘需求数')
plt.title('各大城市数据分析岗位的需求量')
for i in range(temp_ser.size):
    plt.text(i,temp_ser[i] + 5,temp_ser[i],ha = 'center')
plt.show()
    
# 2. 找出不同领域(industryField)对数据分析的需求量并绘制饼图。
# 1)、将不同领域做划分并统计各个领域需求量

# 法一:
# temp_ser1 = temp_df['industryField'].str.extract(r'([\u4e00-\u4e27\u4e29-\u9fa5]+)[,\u4e28]?([\u4e00-\u9fa5]+)?')[0].value_counts()

# 法二:
temp_ser1 = temp_df.industryField.str.split(r'[,,、|丨\s]', expand = True)[0].value_counts()
# 2)、作图
temp_ser1.nlargest(10).plot(kind = 'pie',autopct = '%.2f%%', figsize = (8,4))
plt.title('不同领域(industryField)对数据分析的需求量Top10')
# plt.legend(loc = 'upper right')
plt.show()
    
# 3. 分析各城市的薪资水平并绘制柱状图和折线图。
temp_ser2 = np.round(temp_df.groupby('city').salary.mean(),2)
temp_ser2.plot(kind = 'bar',figsize = (8,4), color = '#17BECF')
plt.plot(temp_ser2.index,temp_ser2,color = '#98C3A1')
plt.xticks(rotation = 0)
plt.ylabel('薪资(单位:K)')
plt.grid(axis='y', alpha = 0.5, linestyle = '--')
for i in range(temp_ser2.size):
    plt.text(i,temp_ser2[i] + 0.2,temp_ser2[i],ha = 'center')
plt.title('各城市的薪资水平')
plt.show()
    

2020销售数据预处理

导入数据

sales_df = pd.read_excel('../files/data/2020年销售数据-2.xlsx')
sales_df
销售日期销售区域销售渠道销售订单品牌售价销售数量销售额Unnamed: 8Unnamed: 9...Unnamed: 13Unnamed: 14Unnamed: 15Unnamed: 16Unnamed: 17Unnamed: 18Unnamed: 19Unnamed: 20Unnamed: 21Unnamed: 22
02020-01-01上海拼多多182894-455八匹马99838217NaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
12020-01-01上海抖音205635-402八匹马219296351NaN行标签...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
22020-01-01上海天猫205654-021八匹马1698514365NaN1月...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
32020-01-01上海天猫205654-519八匹马169142366NaN2月...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
42020-01-01上海天猫377781-010皮皮虾2496115189NaN3月...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
..................................................................
19402020-12-30北京京东D89677花花姑娘269266994NaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
19412020-12-30福建实体182719-050八匹马79977663NaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
19422020-12-31福建实体G70083花花姑娘2695514795NaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
19432020-12-31福建抖音211471-902/704八匹马59593481NaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
19442020-12-31福建天猫211807-050八匹马99272673NaNNaN...NaNNaNNaNNaNNaNNaNNaNNaNNaNNaN

1945 rows × 23 columns

sales_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1945 entries, 0 to 1944
Data columns (total 23 columns):
 #   Column       Non-Null Count  Dtype         
---  ------       --------------  -----         
 0   销售日期         1945 non-null   datetime64[ns]
 1   销售区域         1945 non-null   object        
 2   销售渠道         1945 non-null   object        
 3   销售订单         1945 non-null   object        
 4   品牌           1945 non-null   object        
 5   售价           1945 non-null   int64         
 6   销售数量         1945 non-null   int64         
 7   销售额          1945 non-null   int64         
 8   Unnamed: 8   0 non-null      float64       
 9   Unnamed: 9   40 non-null     object        
 10  Unnamed: 10  35 non-null     object        
 11  Unnamed: 11  12 non-null     object        
 12  Unnamed: 12  14 non-null     object        
 13  Unnamed: 13  14 non-null     object        
 14  Unnamed: 14  13 non-null     object        
 15  Unnamed: 15  12 non-null     object        
 16  Unnamed: 16  6 non-null      object        
 17  Unnamed: 17  7 non-null      object        
 18  Unnamed: 18  6 non-null      object        
 19  Unnamed: 19  6 non-null      object        
 20  Unnamed: 20  6 non-null      object        
 21  Unnamed: 21  6 non-null      object        
 22  Unnamed: 22  10 non-null     object        
dtypes: datetime64[ns](1), float64(1), int64(3), object(18)
memory usage: 349.6+ KB

根据销售日期划分销售季度

sales_df['年'] = sales_df.销售日期.dt.year
sales_df['季度'] = sales_df.销售日期.dt.quarter
sales_df['月份'] = sales_df.销售日期.dt.month
sales_df
销售日期销售区域销售渠道销售订单品牌售价销售数量销售额Unnamed: 8Unnamed: 9...Unnamed: 16Unnamed: 17Unnamed: 18Unnamed: 19Unnamed: 20Unnamed: 21Unnamed: 22季度月份
02020-01-01上海拼多多182894-455八匹马99838217NaNNaN...NaNNaNNaNNaNNaNNaNNaN202011
12020-01-01上海抖音205635-402八匹马219296351NaN行标签...NaNNaNNaNNaNNaNNaNNaN202011
22020-01-01上海天猫205654-021八匹马1698514365NaN1月...NaNNaNNaNNaNNaNNaNNaN202011
32020-01-01上海天猫205654-519八匹马169142366NaN2月...NaNNaNNaNNaNNaNNaNNaN202011
42020-01-01上海天猫377781-010皮皮虾2496115189NaN3月...NaNNaNNaNNaNNaNNaNNaN202011
..................................................................
19402020-12-30北京京东D89677花花姑娘269266994NaNNaN...NaNNaNNaNNaNNaNNaNNaN2020412
19412020-12-30福建实体182719-050八匹马79977663NaNNaN...NaNNaNNaNNaNNaNNaNNaN2020412
19422020-12-31福建实体G70083花花姑娘2695514795NaNNaN...NaNNaNNaNNaNNaNNaNNaN2020412
19432020-12-31福建抖音211471-902/704八匹马59593481NaNNaN...NaNNaNNaNNaNNaNNaNNaN2020412
19442020-12-31福建天猫211807-050八匹马99272673NaNNaN...NaNNaNNaNNaNNaNNaNNaN2020412

1945 rows × 26 columns

计算销售额

sales_df['销售额'] = sales_df.售价 * sales_df.销售数量
sales_df
销售日期销售区域销售渠道销售订单品牌售价销售数量销售额Unnamed: 8Unnamed: 9...Unnamed: 16Unnamed: 17Unnamed: 18Unnamed: 19Unnamed: 20Unnamed: 21Unnamed: 22季度月份
02020-01-01上海拼多多182894-455八匹马99838217NaNNaN...NaNNaNNaNNaNNaNNaNNaN202011
12020-01-01上海抖音205635-402八匹马219296351NaN行标签...NaNNaNNaNNaNNaNNaNNaN202011
22020-01-01上海天猫205654-021八匹马1698514365NaN1月...NaNNaNNaNNaNNaNNaNNaN202011
32020-01-01上海天猫205654-519八匹马169142366NaN2月...NaNNaNNaNNaNNaNNaNNaN202011
42020-01-01上海天猫377781-010皮皮虾2496115189NaN3月...NaNNaNNaNNaNNaNNaNNaN202011
..................................................................
19402020-12-30北京京东D89677花花姑娘269266994NaNNaN...NaNNaNNaNNaNNaNNaNNaN2020412
19412020-12-30福建实体182719-050八匹马79977663NaNNaN...NaNNaNNaNNaNNaNNaNNaN2020412
19422020-12-31福建实体G70083花花姑娘2695514795NaNNaN...NaNNaNNaNNaNNaNNaNNaN2020412
19432020-12-31福建抖音211471-902/704八匹马59593481NaNNaN...NaNNaNNaNNaNNaNNaNNaN2020412
19442020-12-31福建天猫211807-050八匹马99272673NaNNaN...NaNNaNNaNNaNNaNNaNNaN2020412

1945 rows × 26 columns

各维度拆解及透视

# 1、统计月度销售额
sales_df.groupby('月份').销售额.sum()
月份
1     5409855
2     4608455
3     4164972
4     3996770
5     3239005
6     2817936
7     3501304
8     2948189
9     2632960
10    2375385
11    2385283
12    1691973
Name: 销售额, dtype: int64
# 同时计算作用多个聚合函数
sales_df.groupby('月份').销售额.agg([np.sum, np.max, np.min])
sumamaxamin
月份
154098551151041035
246084551334111668
3416497293906990
439967701143121089
53239005859141185
62817936116303690
7350130483930944
829481891067111896
92632960120807948
102375385875271089
112385283683241185
12169197394905897
# 2、统计品牌销售占比
temp = sales_df.groupby('品牌').销售额.sum()
temp.plot(kind = 'pie', autopct = '%.2f%%')
plt.show()
    
# 3、统计各地区月度销售额
# sales_df.groupby(['销售区域', '月份']).销售额.sum()
pd.pivot_table(data = sales_df,
              columns=['月份'],
              index = ['销售区域'],
               values = ['销售额'],
              aggfunc = np.sum,   # 指定聚合函数(默认为np.mean)
              fill_value=0,   # 空值填充值
              margins=True,   # 是否显示总计
              margins_name='总计'   # 设置总计名字
              )
销售额
月份123456789101112总计
销售区域
上海1679125168952710611931082187841199785404863906734937110769341210882516952804111610489
北京18782341807787136066612059898073001216432121908364572739007767160867866859614612477717
南京0000008410320071096202153071767301
安徽0003413085541550000000895463
广东003881800000469390365191039518801617949
江苏00053707900000000537079
浙江0024835400004395080000687862
福建185249611111411106579830207103635181610057728365862776999958070748625835247910178227
总计54098554608455416497239967703239005281793635013042948189263296023753852385283169197339772087
# 4、统计各渠道品牌销量
sales_df.groupby(['销售渠道','品牌']).销售额.sum()
销售渠道  品牌  
京东    八匹马     1030702
      啊哟喂      148487
      壁虎       984961
      皮皮虾     1362590
      花花姑娘    4167728
天猫    八匹马     1722144
      啊哟喂      190694
      壁虎      1489656
      皮皮虾     2511090
      花花姑娘    7785319
实体    八匹马      843010
      啊哟喂       99498
      壁虎       702396
      皮皮虾     1269346
      花花姑娘    2234169
抖音    八匹马      622542
      啊哟喂      108039
      壁虎       619105
      皮皮虾      833905
      花花姑娘    2599314
拼多多   八匹马     1116248
      啊哟喂      146441
      壁虎       882861
      皮皮虾     1915340
      花花姑娘    4386502
Name: 销售额, dtype: int64
sales_df.pivot_table(index = ['销售渠道'],
                    columns=['品牌'],
                    values = ['销售额'],
                    aggfunc=np.sum,
                    margins=True,
                    margins_name='总计')
销售额
品牌八匹马啊哟喂壁虎皮皮虾花花姑娘总计
销售渠道
京东1030702148487984961136259041677287694468
天猫172214419069414896562511090778531913698903
实体84301099498702396126934622341695148419
抖音62254210803961910583390525993144782905
拼多多1116248146441882861191534043865028447392
总计5334646693159467897978922712117303239772087
# 统计不同售价区间月度销量占比
# 1)、查找最小值
min_price = sales_df['售价'].min()
max_price = sales_df['售价'].max()
min_price,max_price
(59, 1499)
# 2)、分箱
bins = np.arange(min_price,max_price + 1, 180)
bins
array([  59,  239,  419,  599,  779,  959, 1139, 1319, 1499], dtype=int64)
cate = pd.cut(sales_df.售价, bins)
sales_df.groupby([cate,'月份']).销售数量.sum()
售价                月份
(90.75, 95.75]    1       0
                  2       0
                  3       0
                  4       0
                  5       0
                       ... 
(115.75, 120.75]  8     178
                  9      61
                  10      0
                  11    199
                  12     77
Name: 销售数量, Length: 72, dtype: int64
# 3)、分箱数据透视各品牌月度求和
sales_df_ = pd.pivot_table(data = sales_df,
              index = cate,
              columns=['月份'],
              values = ['销售数量'],
              aggfunc = np.sum)
sales_df_
销售数量
月份123456789101112
售价
(59, 239]393041523412340736952800278622752388294732712651
(239, 419]387431224295286219502736255420842219232320371892
(419, 599]272221942228281322821459226017421656128819221049
(599, 779]10678646615036214557136445894548221
(779, 959]4561873031802211274161388302050
(959, 1139]3563483192472313693342280095
(1139, 1319]382414201993823911989118113032
(1319, 1499]108104059000370000
ser = sales_df_.sum()
sales_df_ = np.round(sales_df_.divide(ser) * 100, 2)
sales_df_
销售数量
月份123456789101112
售价
(59, 239]30.4836.4730.3633.1740.8835.6631.1630.9533.7241.3643.5146.18
(239, 419]30.0427.4238.2227.8721.5834.8428.5728.3531.3432.6027.1032.96
(419, 599]21.1119.2719.8327.3925.2518.5825.2823.7023.3918.0825.5718.28
(599, 779]8.277.595.884.906.875.797.978.768.326.371.090.37
(779, 959]3.541.642.701.752.451.624.651.881.170.002.730.00
(959, 1139]2.763.062.842.412.560.461.044.650.400.000.001.66
(1139, 1319]2.963.640.181.940.423.041.331.211.671.590.000.56
(1319, 1499]0.840.910.000.570.000.000.000.500.000.000.000.00
sales_df_.applymap(lambda x: f'{x}%')
销售数量
月份123456789101112
售价
(59, 239]30.48%36.47%30.36%33.17%40.88%35.66%31.16%30.95%33.72%41.36%43.51%46.18%
(239, 419]30.04%27.42%38.22%27.87%21.58%34.84%28.57%28.35%31.34%32.6%27.1%32.96%
(419, 599]21.11%19.27%19.83%27.39%25.25%18.58%25.28%23.7%23.39%18.08%25.57%18.28%
(599, 779]8.27%7.59%5.88%4.9%6.87%5.79%7.97%8.76%8.32%6.37%1.09%0.37%
(779, 959]3.54%1.64%2.7%1.75%2.45%1.62%4.65%1.88%1.17%0.0%2.73%0.0%
(959, 1139]2.76%3.06%2.84%2.41%2.56%0.46%1.04%4.65%0.4%0.0%0.0%1.66%
(1139, 1319]2.96%3.64%0.18%1.94%0.42%3.04%1.33%1.21%1.67%1.59%0.0%0.56%
(1319, 1499]0.84%0.91%0.0%0.57%0.0%0.0%0.0%0.5%0.0%0.0%0.0%0.0%
df1 = pd.DataFrame({
    "类别": ["手机", "手机", "手机", "手机", "手机", "电脑", "电脑", "电脑", "电脑"],
    "品牌": ["华为", "华为", "华为", "小米", "小米", "华为", "华为", "小米", "小米"],
    "等级": ["A类", "B类", "A类", "B类", "C类", "A类", "B类", "C类", "A类"],
    "A组": [1, 2, 2, 3, 3, 4, 5, 6, 7],
    "B组": [2, 4, 5, 5, 6, 6, 8, 9, 9]
})
df1
类别品牌等级A组B组
0手机华为A类12
1手机华为B类24
2手机华为A类25
3手机小米B类35
4手机小米C类36
5电脑华为A类46
6电脑华为B类58
7电脑小米C类69
8电脑小米A类79
# 任务1:A组手机和电脑各卖出多少台
# 法一:
# df1.groupby(['类别','等级']).A组.sum()
# 法二:
pd.pivot_table(data = df1,
              index = ['类别'],
              columns=['等级'],
              values = ['A组'],
              aggfunc=np.sum,
              margins=True,
              margins_name='总计')
A组
等级A类B类C类总计
类别
手机35311
电脑115622
总计1410933
# 任务2:A组不同品牌的手机和电脑各卖出多少台
pd.pivot_table(data = df1,
              index = ['类别'],
              columns=['品牌'],
              values = ['A组'],
              aggfunc=np.sum,
              margins=True,
              margins_name='总计')
A组
品牌华为小米总计
类别
手机5611
电脑91322
总计141933
# 任务3:不同品牌的手机和电脑,A组和B组各卖出多少台
pd.pivot_table(data = df1,
              index = ['类别'],
              columns=['品牌'],
              values = ['A组','B组'],
              aggfunc=np.sum,
              margins=True,
              margins_name='总计')
A组B组
品牌华为小米总计华为小米总计
类别
手机5611111122
电脑91322141832
总计141933252954
df_luohu = pd.read_csv('../files/data/2018年北京积分落户数据.csv')
df_luohu
idnamebirthdaycompanyscore
01杨效丰1972-12北京利德华福电气技术有限公司122.59
12纪丰伟1974-12北京航天数据股份有限公司121.25
23王永1974-05品牌联盟(北京)咨询股份公司118.96
34杨静1975-07中科专利商标代理有限责任公司118.21
45张凯江1974-11北京阿里巴巴云计算技术有限公司117.79
..................
60146015孙宏波1978-08华为海洋网络有限公司北京科技分公司90.75
60156016刘丽香1976-11福斯(上海)流体设备有限公司北京分公司90.75
60166017周崧1977-10赢创德固赛(中国)投资有限公司90.75
60176018赵妍1979-07澳科利耳医疗器械(北京)有限公司90.75
60186019贺锐1981-06北京宝洁技术有限公司90.75

6019 rows × 5 columns

# 1. 根据company将落户人员分组,统计每个公司有多少积分落户人员?
luohu_ser = df_luohu.groupby('company').id.count()
luohu_ser.nlargest(20).plot(kind = 'bar',figsize = (8,4))
for i in range(luohu_ser.nlargest(20).size):
    plt.text(i,luohu_ser.nlargest(20)[i] + 1,luohu_ser.nlargest(20)[i],ha = 'center')
plt.show()
    
# 2. 根据年龄将落户人员分组,统计每个年龄段有多少人(建议5岁一个年龄段)?
from datetime import datetime

date = pd.to_datetime(df_luohu.birthday)
df_luohu['age'] = (datetime(2018,7,1) - date).dt.days // 365
bins = np.arange(30,61,5)
box = pd.cut(df_luohu.age,bins,right = False)
ser = df_luohu.groupby(box).name.count()
ser.plot(kind = 'bar')
plt.xticks(rotation = 0)
for i in range(ser.size):
    plt.text(i,ser[i]+30,ser[i],ha = 'center')   #数字居中显示
plt.show()
    
# 3. 根据落户积分将落户人员分组,统计每个积分段有多少人?
max_score = df_luohu['score'].max()
min_score = df_luohu['score'].min()

bins = np.arange(min_score,max_score,5)
box = pd.cut(df_luohu.score,bins,right = False)
ser = df_luohu.groupby(box).name.count()
ser.plot(kind = 'bar')
for i in range(ser.size):
    plt.text(i,ser[i]+30,ser[i],ha = 'center')   #数字居中显示
plt.show()


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值