数据分析第4天-Pandas1¶

  1. series - 数据系列 - 一维数据
  2. dataframe -数据框/数据窗/数据表 - 处理二维数据
  3. index - 提供索引服务
In [2]:
# %load hello.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'].insert(0, 'SimHei')
plt.rcParams['axes.unicode_minus'] = False
%config InlineBackend.figure_format = 'svg'

创建dataframe对象¶

In [14]:
#方法一:构造器 + 二维数组
In [7]:
scores = np.random.randint(60,101,(5,3))
scores
Out[7]:
array([[ 61,  60,  68],
       [ 81,  87,  93],
       [ 89,  81,  83],
       [ 81, 100,  75],
       [ 91,  85,  83]], dtype=int32)
In [13]:
df1 = pd.DataFrame(
    data=scores,
    columns=['Verbal','Math','English'],
    index=np.arange(1001,1006)
)
df1
Out[13]:
Verbal Math English
1001 61 60 68
1002 81 87 93
1003 89 81 83
1004 81 100 75
1005 91 85 83
In [ ]:
#方法二:构造器+ 字典
In [16]:
scores_dict = {
    'Verbal':scores[:,0],
    'Math':scores[:,1],
    'English':scores[:,2],
}
scores_dict
Out[16]:
{'Verbal': array([61, 81, 89, 81, 91], dtype=int32),
 'Math': array([ 60,  87,  81, 100,  85], dtype=int32),
 'English': array([68, 93, 83, 75, 83], dtype=int32)}
In [17]:
df2 = pd.DataFrame(
    data=scores_dict,
    index=np.arange(1001,1006)
)
df2
Out[17]:
Verbal Math English
1001 61 60 68
1002 81 87 93
1003 89 81 83
1004 81 100 75
1005 91 85 83
In [19]:
#方法三,从csv文件中加载数据
In [33]:
df3 = pd.read_csv(
    'wenjian/2023年北京积分落户数据.csv',
    # sep=',',                    #分隔符,默认是逗号可不写
    # header=0,                   # 表头所在的行默认值是0
    # encoding='utf-8',           # 指定编码
    # index_col='公示编号',        #充当行索引的列
    # usecols=['公示编号','姓名','积分分值'], #指定加载的列
    # nrows=100,                  #加载行数
    # skiprows=np.arange(1,21),   #跳过的行范围
    # quotechar='"',              #包裹字符串的的字符(默认是双引号)
    # true_values=['Yes','Y','真','是'], #被视为布尔True的值
    # false_values=['No','N','伪','否'], #被视为布尔False的值
    # na_values=['N/A','---'],    #被视为空值的值
)
df3
Out[33]:
公示编号 姓名 出生年月 单位名称 积分分值
0 202300001 张浩 1977-02 北京首钢股份有限公司 140.05
1 202300002 冯云 1982-02 中国人民解放军空军二十三厂 134.29
2 202300003 王天东 1975-01 中建二局第三建筑工程有限公司 133.63
3 202300004 陈军 1976-07 中建二局第三建筑工程有限公司 133.29
4 202300005 樊海瑞 1981-06 中国民生银行股份有限公司 132.46
... ... ... ... ... ...
5998 202305999 曹恰 1983-09 首都师范大学科德学院 109.92
5999 202306000 罗佳 1981-05 厦门方胜众合企业服务有限公司海淀分公司 109.92
6000 202306001 席盛代 1983-06 中国华能集团清洁能源技术研究院有限公司 109.92
6001 202306002 彭芸芸 1981-09 北京汉杰凯德文化传播有限公司 109.92
6002 202306003 张越 1982-01 大爱城投资控股有限公司 109.92

6003 rows × 5 columns

In [ ]:
pd.read_csv(
    'wenjian/bilibili.csv',
    encoding='gbk', 
)
#df4
In [ ]:
%pip install pyarrow
In [ ]:
df4 = pd.read_csv(
    'wenjian/big_data_file.csv.gz',
    # low_memory=False,     #低内存模式
    engine='pyarrow',       #更换引擎,速度更快
)
df4
In [54]:
iter_obj = pd.read_csv(
    'wenjian/big_data_file.csv.gz',
    iterator=True,    #开启迭代器模式
    chunksize=50000,  #每次加载的数据量
)
In [ ]:
next(iter_obj)
In [ ]:
# 方法四:从excel加载数据创建dataframe对象
In [ ]:
df5 = pd.read_excel(
    'wenjian/2020年销售数据.xlsx',
    sheet_name='data',           # 指定数据在哪张表
)
df5
In [ ]:
# 方法五:从数据库二维表加载数据
In [62]:
#%pip install pymysql sqlalchemy
In [63]:
import pymysql
conn = pymysql.connect(
    host='47.109.26.237',
    port=3306,
    user='guest',
    password='Guest.618',
    database='hrs',
    charset='utf8mb4',
)
conn
Out[63]:
<pymysql.connections.Connection at 0x1b486781340>
In [ ]:
pd.read_sql('select * from tb_emp',conn)
In [145]:
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://guest:Guest.618@47.109.26.237:3306/hrs')
engine
Out[145]:
Engine(mysql+pymysql://guest:***@47.109.26.237:3306/hrs)
In [72]:
df6 = pd.read_sql(
    'tb_emp',
    engine,
    index_col=['eno']        
)
df6
Out[72]:
ename job mgr sal comm dno
eno
1359 胡一刀 销售员 3344.0 1800 200.0 30
2056 乔峰 分析师 7800.0 5000 1500.0 20
3088 李莫愁 设计师 2056.0 3500 800.0 20
3211 张无忌 程序员 2056.0 3200 NaN 20
3233 丘处机 程序员 2056.0 3400 NaN 20
3244 欧阳锋 程序员 3088.0 3200 NaN 20
3251 张翠山 程序员 2056.0 4000 NaN 20
3344 黄蓉 销售主管 7800.0 3000 800.0 30
3577 杨过 会计 5566.0 2200 NaN 10
3588 朱九真 会计 5566.0 2500 NaN 10
4466 苗人凤 销售员 3344.0 2500 NaN 30
5234 郭靖 出纳 5566.0 2000 NaN 10
5566 宋远桥 会计师 7800.0 4000 1000.0 10
7800 张三丰 总裁 NaN 9000 1200.0 20
In [69]:
engine.connect().close()
In [74]:
#查看信息
df6.info(memory_usage='deep')
<class 'pandas.core.frame.DataFrame'>
Index: 14 entries, 1359 to 7800
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   ename   14 non-null     object 
 1   job     14 non-null     object 
 2   mgr     13 non-null     float64
 3   sal     14 non-null     int64  
 4   comm    6 non-null      float64
 5   dno     14 non-null     int64  
dtypes: float64(2), int64(2), object(2)
memory usage: 2.5 KB
In [77]:
#查看N行  head()/ tail()  前后
In [102]:
#设置索引
df5.set_index(
    np.arange(10001,11946),inplace=True
)
df5
Out[102]:
销售日期 销售区域 销售渠道 销售订单 品牌 售价 销售数量 直接成本
10001 43831 上海 拼多多 200101007627 八匹马 99 83 3351
10002 43831 上海 抖音 200101005623 八匹马 219 29 1016
10003 43831 上海 天猫 200101004554 八匹马 169 85 6320
10004 43831 上海 天猫 200101009600 八匹马 169 14 485
10005 43831 上海 天猫 200101007986 皮皮虾 249 61 2452
... ... ... ... ... ... ... ... ...
11941 44195 北京 京东 201230004052 花花姑娘 269 26 1560
11942 44195 福建 实体 201230007101 八匹马 79 97 3028
11943 44196 福建 实体 201231009600 花花姑娘 269 55 2277
11944 44196 福建 抖音 201231003362 八匹马 59 59 852
11945 44196 福建 天猫 201231003844 八匹马 99 27 435

1945 rows × 8 columns

In [75]:
df5.head(3)
Out[75]:
销售日期 销售区域 销售渠道 销售订单 品牌 售价 销售数量 直接成本 销售代表
0 43831 上海 拼多多 200101007627 八匹马 99 83 3351 S00982
1 43831 上海 抖音 200101005623 八匹马 219 29 1016 S00871
2 43831 上海 天猫 200101004554 八匹马 169 85 6320 S00871
In [76]:
df5.tail(5)
Out[76]:
销售日期 销售区域 销售渠道 销售订单 品牌 售价 销售数量 直接成本 销售代表
1940 44195 北京 京东 201230004052 花花姑娘 269 26 1560 S00344
1941 44195 福建 实体 201230007101 八匹马 79 97 3028 S00677
1942 44196 福建 实体 201231009600 花花姑娘 269 55 2277 S00604
1943 44196 福建 抖音 201231003362 八匹马 59 59 852 S00272
1944 44196 福建 天猫 201231003844 八匹马 99 27 435 S00272
In [78]:
#筛选数据
In [86]:
#操作列
df5[['销售区域','品牌']]   # df5.品牌
Out[86]:
销售区域 品牌
0 上海 八匹马
1 上海 八匹马
2 上海 八匹马
3 上海 八匹马
4 上海 皮皮虾
... ... ...
1940 北京 花花姑娘
1941 福建 八匹马
1942 福建 花花姑娘
1943 福建 八匹马
1944 福建 八匹马

1945 rows × 2 columns

In [ ]:
#添加列
df5['状态'] = ['已完成'] * 1000 + ['未完成'] * 945
df5
In [105]:
#删除列
# df5.drop(columns=['状态','销售代表'])   # 删除后返回结果 并没有修改源数据
# df5.drop(columns=['状态','销售代表'],inplace=True) #inplace=True 直接修改源数据
df5
Out[105]:
销售日期 销售区域 销售渠道 销售订单 品牌 售价 销售数量 直接成本
10001 43831 上海 拼多多 200101007627 八匹马 99 83 3351
10002 43831 上海 抖音 200101005623 八匹马 219 29 1016
10003 43831 上海 天猫 200101004554 八匹马 169 85 6320
10004 43831 上海 天猫 200101009600 八匹马 169 14 485
10005 43831 上海 天猫 200101007986 皮皮虾 249 61 2452
... ... ... ... ... ... ... ... ...
11941 44195 北京 京东 201230004052 花花姑娘 269 26 1560
11942 44195 福建 实体 201230007101 八匹马 79 97 3028
11943 44196 福建 实体 201231009600 花花姑娘 269 55 2277
11944 44196 福建 抖音 201231003362 八匹马 59 59 852
11945 44196 福建 天猫 201231003844 八匹马 99 27 435

1945 rows × 8 columns

In [107]:
#获取行
df5.loc[10001]
Out[107]:
销售日期           43831
销售区域              上海
销售渠道             拼多多
销售订单    200101007627
品牌               八匹马
售价                99
销售数量              83
直接成本            3351
Name: 10001, dtype: object
In [108]:
df5.iloc[[1,3,5,7]]
Out[108]:
销售日期 销售区域 销售渠道 销售订单 品牌 售价 销售数量 直接成本
10002 43831 上海 抖音 200101005623 八匹马 219 29 1016
10004 43831 上海 天猫 200101009600 八匹马 169 14 485
10006 43832 上海 京东 200102007683 皮皮虾 799 68 15203
10008 43833 上海 天猫 200103008960 壁虎 239 82 4127
In [110]:
df5.loc[10001:10005]
Out[110]:
销售日期 销售区域 销售渠道 销售订单 品牌 售价 销售数量 直接成本
10001 43831 上海 拼多多 200101007627 八匹马 99 83 3351
10002 43831 上海 抖音 200101005623 八匹马 219 29 1016
10003 43831 上海 天猫 200101004554 八匹马 169 85 6320
10004 43831 上海 天猫 200101009600 八匹马 169 14 485
10005 43831 上海 天猫 200101007986 皮皮虾 249 61 2452
In [112]:
df5.iloc[0:5]
Out[112]:
销售日期 销售区域 销售渠道 销售订单 品牌 售价 销售数量 直接成本
10001 43831 上海 拼多多 200101007627 八匹马 99 83 3351
10002 43831 上海 抖音 200101005623 八匹马 219 29 1016
10003 43831 上海 天猫 200101004554 八匹马 169 85 6320
10004 43831 上海 天猫 200101009600 八匹马 169 14 485
10005 43831 上海 天猫 200101007986 皮皮虾 249 61 2452
In [125]:
#获取单元格
df5.at[10001,'售价']  # df5.iat[0,5]  x行y列
df5.iat[0,5]
Out[125]:
np.int64(99)
In [ ]:
#筛选数据
df5[(df5['销售区域'] == '安徽') & (df5['销售渠道'] == '天猫')]
In [ ]:
df5.query("销售区域 in ['上海','福建','北京'] and 销售渠道 == '天猫'")
diqu = ['上海','福建','北京']
df5.query("销售区域 in @diqu and 销售渠道 == '天猫'")  #调用变量名前加@
In [143]:
#数据抽样
# replace = False 无放回抽样
# replace = True  有放回抽样
df5.sample(n=120,replace = False)   # 随机抽样
Out[143]:
销售日期 销售区域 销售渠道 销售订单 品牌 售价 销售数量 直接成本
11786 44155 北京 拼多多 201120004262 八匹马 169 72 3254
10063 43840 福建 天猫 200110001110 花花姑娘 399 72 10467
11491 44085 北京 天猫 200911005803 花花姑娘 399 54 8074
11898 44183 上海 天猫 201218009470 壁虎 399 52 7546
10394 43882 上海 天猫 200221007225 皮皮虾 499 19 3981
... ... ... ... ... ... ... ... ...
10059 43840 北京 天猫 200110008666 壁虎 299 14 1495
11065 43993 北京 拼多多 200611003039 花花姑娘 229 27 2314
10166 43852 上海 天猫 200122008599 皮皮虾 499 49 8375
10770 43940 北京 天猫 200419008535 花花姑娘 599 12 2463
11809 44159 广东 拼多多 201124006230 壁虎 269 42 2120

120 rows × 8 columns

In [ ]:
#数据重塑
In [156]:
emp1 = pd.read_sql('tb_emp',engine,index_col='eno')
emp2 = pd.read_sql('tb_emp2',engine,index_col='eno')
dept = pd.read_sql('tb_dept',engine,index_col='dno')
In [157]:
# 拼接(将多张数据结构相同的表拼接在一起) - union
emp = pd.concat((emp1,emp2))
emp
Out[157]:
ename job mgr sal comm dno
eno
1359 胡一刀 销售员 3344.0 1800 200.0 30
2056 乔峰 分析师 7800.0 5000 1500.0 20
3088 李莫愁 设计师 2056.0 3500 800.0 20
3211 张无忌 程序员 2056.0 3200 NaN 20
3233 丘处机 程序员 2056.0 3400 NaN 20
3244 欧阳锋 程序员 3088.0 3200 NaN 20
3251 张翠山 程序员 2056.0 4000 NaN 20
3344 黄蓉 销售主管 7800.0 3000 800.0 30
3577 杨过 会计 5566.0 2200 NaN 10
3588 朱九真 会计 5566.0 2500 NaN 10
4466 苗人凤 销售员 3344.0 2500 NaN 30
5234 郭靖 出纳 5566.0 2000 NaN 10
5566 宋远桥 会计师 7800.0 4000 1000.0 10
7800 张三丰 总裁 NaN 9000 1200.0 20
9500 张三丰 总裁 NaN 50000 8000.0 20
9600 王大锤 程序员 9800.0 8000 600.0 20
9700 张三丰 总裁 NaN 60000 6000.0 20
9800 骆昊 架构师 7800.0 30000 5000.0 20
9900 陈小刀 分析师 9800.0 10000 1200.0 20
In [176]:
#合并, join
# how - inner / outer /left / right -连表方式
# on / left_on / right_on - 连表使用的字段 
# pd.merge(emp,dept,how='inner',on='dno')  
temp = pd.merge(emp,dept,how='inner',left_on='dno',right_on='dno')  
In [163]:
import os
In [173]:
list1 = os.listdir(r'wenjian\jobs\jobs') 
lista = []
for x in list1:
    lista.append(pd.read_csv(fr'wenjian\jobs\jobs\{x}'))
pd.concat(lista).reset_index(drop=True).to_csv('all_jobs.csv',index=False)
In [ ]:
#数据清洗
1.缺失值
2.重复值
3.异常值
In [177]:
temp.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 19 entries, 0 to 18
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   ename   19 non-null     object 
 1   job     19 non-null     object 
 2   mgr     16 non-null     float64
 3   sal     19 non-null     int64  
 4   comm    11 non-null     float64
 5   dno     19 non-null     int64  
 6   dname   19 non-null     object 
 7   dloc    19 non-null     object 
dtypes: float64(2), int64(2), object(4)
memory usage: 1.3+ KB
In [ ]:
# 甄别空值     
# isna()   notna() 等同 isnull 和 notnull
temp.notnull()
In [ ]:
#删除空值
temp.dropna(axis =1)   #axis=1 删空值的整列  , 0 删整行
In [ ]:
# 填充空值
# temp.fillna(0)   # 查询空值替换为0
temp.comm.fillna(0).astype('i8')
In [ ]:
temp['mgr'] = temp.mgr.fillna(-1).astype('i8')
temp
In [ ]:
temp.comm.ffill()  #将空值的上面的值向下填充
temp.comm.bfill()  #向上填充
In [195]:
temp['comm']=temp.comm.interpolate().astype('i8') #将插值相邻的值的等距填充 
In [ ]:
temp.notnull() #检测是否还有空值
In [199]:
temp
Out[199]:
ename job mgr sal comm dno dname dloc
0 胡一刀 销售员 3344 1800 200 30 销售部 重庆
1 乔峰 分析师 7800 5000 1500 20 研发部 成都
2 李莫愁 设计师 2056 3500 800 20 研发部 成都
3 张无忌 程序员 2056 3200 800 20 研发部 成都
4 丘处机 程序员 2056 3400 800 20 研发部 成都
5 欧阳锋 程序员 3088 3200 800 20 研发部 成都
6 张翠山 程序员 2056 4000 800 20 研发部 成都
7 黄蓉 销售主管 7800 3000 800 30 销售部 重庆
8 杨过 会计 5566 2200 840 10 会计部 北京
9 朱九真 会计 5566 2500 880 10 会计部 北京
10 苗人凤 销售员 3344 2500 920 30 销售部 重庆
11 郭靖 出纳 5566 2000 960 10 会计部 北京
12 宋远桥 会计师 7800 4000 1000 10 会计部 北京
13 张三丰 总裁 -1 9000 1200 20 研发部 成都
14 张三丰 总裁 -1 50000 8000 20 研发部 成都
15 王大锤 程序员 9800 8000 600 20 研发部 成都
16 张三丰 总裁 -1 60000 6000 20 研发部 成都
17 骆昊 架构师 7800 30000 5000 20 研发部 成都
18 陈小刀 分析师 9800 10000 1200 20 研发部 成都
In [ ]:
#甄别重复值
temp.duplicated(['ename','job'],keep='last')
In [ ]:
temp.ename.duplicated(keep='first')
In [209]:
#删除重复值
temp.drop_duplicates(['ename','job'],keep='last',inplace=True)
In [210]:
temp
Out[210]:
ename job mgr sal comm dno dname dloc
0 胡一刀 销售员 3344 1800 200 30 销售部 重庆
1 乔峰 分析师 7800 5000 1500 20 研发部 成都
2 李莫愁 设计师 2056 3500 800 20 研发部 成都
3 张无忌 程序员 2056 3200 800 20 研发部 成都
4 丘处机 程序员 2056 3400 800 20 研发部 成都
5 欧阳锋 程序员 3088 3200 800 20 研发部 成都
6 张翠山 程序员 2056 4000 800 20 研发部 成都
7 黄蓉 销售主管 7800 3000 800 30 销售部 重庆
8 杨过 会计 5566 2200 840 10 会计部 北京
9 朱九真 会计 5566 2500 880 10 会计部 北京
10 苗人凤 销售员 3344 2500 920 30 销售部 重庆
11 郭靖 出纳 5566 2000 960 10 会计部 北京
12 宋远桥 会计师 7800 4000 1000 10 会计部 北京
15 王大锤 程序员 9800 8000 600 20 研发部 成都
16 张三丰 总裁 -1 60000 6000 20 研发部 成都
17 骆昊 架构师 7800 30000 5000 20 研发部 成都
18 陈小刀 分析师 9800 10000 1200 20 研发部 成都
In [211]:
# 非重复的数量
temp.job.nunique()
Out[211]:
10
In [212]:
# 获取非重的值
temp.job.unique()
Out[212]:
array(['销售员', '分析师', '设计师', '程序员', '销售主管', '会计', '出纳', '会计师', '总裁', '架构师'],
      dtype=object)
In [213]:
#统计每个职位的数量
temp.job.value_counts()
Out[213]:
job
程序员     5
销售员     2
分析师     2
会计      2
设计师     1
销售主管    1
出纳      1
会计师     1
总裁      1
架构师     1
Name: count, dtype: int64
In [ ]:
temp.sal.plot(kind='box', whis=3)
plt.show()
In [233]:
# data < Q1 -1.5 * IQR or data > Q3 + 1.5 * IQR
def find_outliers(data,whis=1.5):
    Q1,Q3 = np.quantile(data,[0.25,0.75])
    IQR = Q3 - Q1
    return data[(data < Q1 -whis * IQR) | (data > Q3 + whis * IQR)]
liqun = find_outliers(temp.sal, whis=3)
yichang = liqun.values
Out[233]:
array([60000, 30000])
In [238]:
#zscore =(data - mu) / sigma ---> |zscore| >3
def find_outliers2(data):
    mu , sigma = np.mean(data) , np.std(data)
    return data[np.abs((data - mu) / sigma) >3]
In [243]:
find_outliers2(temp.sal)
Out[243]:
Series([], Name: sal, dtype: int64)
In [232]:
normal_sal = temp.sal.median()
normal_sal
Out[232]:
np.float64(3400.0)
In [ ]:
#替换异常值
temp['sal'] = temp.sal.replace(liqun.values,normal_sal)
temp
In [ ]:
#删除异常值
temp.drop(index=temp.query('sal in @yichang').index,inplace=True)
In [4]:
jobs = pd.read_csv('all_jobs.csv')
jobs
Out[4]:
company_name uri salary site year edu job_name city pos_count
0 中国电信云 https://www.zhipin.com/job_detail/11266fc18dc1... 20-40K·17薪 北京 海淀区 西山 经验不限 本科 Python beijing 1
1 奇虎360 https://www.zhipin.com/job_detail/2a3103941dc2... 20-40K·15薪 北京 朝阳区 酒仙桥 3-5年 大专 Python beijing 6
2 VIPKID https://www.zhipin.com/job_detail/2dd7f2760947... 20-40K·14薪 北京 朝阳区 十里堡 5-10年 本科 Python beijing 4
3 天阳科技 https://www.zhipin.com/job_detail/a0c8485a448b... 12-24K 北京 石景山区 八宝山 1-3年 本科 python工程师 beijing 2
4 武汉佰钧成 https://www.zhipin.com/job_detail/d6627bf7c1e2... 12-17K 北京 朝阳区 三元桥 3-5年 大专 python开发 beijing 3
... ... ... ... ... ... ... ... ... ...
9820 公众智能 https://www.zhipin.com/job_detail/7b9c08dbce81... 8-10K 西安 3-5年 本科 产品经理 xian 2
9821 微感 https://www.zhipin.com/job_detail/c7e99005528f... 8-10K 西安 雁塔区 紫薇田园都市 3-5年 大专 产品经理 xian 4
9822 巴斯光年 https://www.zhipin.com/job_detail/1045fe64f248... 10-20K 西安 雁塔区 大雁塔 3-5年 本科 产品经理 xian 6
9823 西大华特科技 https://www.zhipin.com/job_detail/e3c21cc748e7... 5-8K 西安 雁塔区 唐延路 1-3年 硕士 产品经理(农药) xian 6
9824 西安纯粹科技 https://www.zhipin.com/job_detail/09965129db3e... 3-6K 西安 雁塔区 玫瑰大楼 1-3年 本科 产品经理 xian 5

9825 rows × 9 columns

In [7]:
jobs.drop_duplicates('uri',inplace=True)
jobs.shape
Out[7]:
(9777, 9)
In [9]:
jobs.drop(columns=['uri','city'],inplace=True)
jobs.shape
Out[9]:
(9777, 7)
In [16]:
jobs['city'] = jobs.site.str.split(expand=True)[0]
Out[16]:
company_name salary site year edu job_name pos_count city
0 中国电信云 20-40K·17薪 北京 海淀区 西山 经验不限 本科 Python 1 北京
1 奇虎360 20-40K·15薪 北京 朝阳区 酒仙桥 3-5年 大专 Python 6 北京
2 VIPKID 20-40K·14薪 北京 朝阳区 十里堡 5-10年 本科 Python 4 北京
In [17]:
jobs.drop(columns='site',inplace=True)
In [18]:
jobs.head(2)
Out[18]:
company_name salary year edu job_name pos_count city
0 中国电信云 20-40K·17薪 经验不限 本科 Python 1 北京
1 奇虎360 20-40K·15薪 3-5年 大专 Python 6 北京
In [25]:
jobs['salary'] = jobs.salary.str.extract(r'(\d+)-(\d+)').astype('i8').mean(axis=1)
In [34]:
jobs['year'] = jobs.year.replace('5-10年|10年以上','5年以上',regex=True)
In [38]:
jobs.year.unique()
Out[38]:
array(['经验不限', '3-5年', '5年以上', '1-3年', '应届生', '1年以内'], dtype=object)
In [36]:
jobs['edu'] = jobs.edu.replace('高中|中专','学历不限',regex=True).replace('硕士|博士','研究生',regex=True)
In [37]:
jobs.edu.unique()
Out[37]:
array(['本科', '大专', '研究生', '学历不限'], dtype=object)
In [43]:
jobs.job_name.unique()
Out[43]:
array(['Python', 'python工程师', 'python开发', ..., '产品经理(薪资:8-12k)',
       '出境旅游产品经理', '产品经理(农药)'], shape=(2739,), dtype=object)
In [46]:
jobs['job_name'] = jobs.job_name.str.lower()
In [48]:
results = jobs[jobs.job_name.str.contains('python|数据|ai|bi',regex=True)]
results.to_csv('wenjian/new_jobs.csv',index=False)
In [ ]: