Pandas 数据分析处理实操

  1. 1. 案例一
    1. 1.1 数据读取
    2. 1.2 预分析
    3. 1.3 数据清洗
    4. 1.4 数据分析
    5. 1.5 可视化

@

1. 案例一

1.1 数据读取

>>> df=pd.read_csv('D:\ 数据分析素材 \DataAnalyst.csv',encoding='gb2312')
>>> df

前几列:

后几列:

上述呈现形式只能看个大概,需要对这些数据进一步进行粗略统计分析观察

1.2 预分析

>>> df.info()

由此可以看到,每一列应该包含 6876 个数据,但是 index=3,6……等数据有空,其数据是不完整的。

表格数据中’positionId’这一列代表的招聘公司及职位的 ID,具有唯一性,有多少 ID,就有多少招聘岗位。其他为重复值。

>>> len(df.positionId.unique())
5031

由此可以看到有效数据量为 5031 条。

1.3 数据清洗

删除重复值

>>> df1=df.drop_duplicates(['positionId'])     // 按 positionID 列删除重复值
>>> df1.info()

数据规整

我们最为关心的数据之一就是薪水,它给出的是一个范围,我们要提取其中最大和最小值。

// 定义一个切词函数
def cut_word(word,method):
    position=word.find('-')   // 在 word 里找 '-',找到了返回其索引位置,找不到返回 -1
    length=len(word)
    if position != -1:         
        bottom_salary=word[:position-1]        // 如 word 为 '6k-9k', 则返回 6
        top_salary=word[position+1:length-1]
    else:
        bottom_salary=word[:word.upper().find('K')] // 有的 word 里是 '10K 以上 ',没有 '-',则只取数字部分
        top_salary=bottom_salary
    if method == 'bottom':
        return bottom_salary
    else:
        return top_salary

>>> df1['bottom_salary']=df1.salary.apply(cut_word,method='bottom') // 注意这里传参方式
>>> df1['top_salary']=df1.salary.apply(cut_word,method='top')
>>> df1.head() 

这里的’bottom_salary’和’top_salary’都是字符类型数据,需要转换成整型数据。

>>> df1.bottom_salary = df1.bottom_salary.astype('int')  // 数据类型转换
>>> df1.top_salary = df1.top_salary.astype('int')
>>> df1['avg_salary'] = df1.apply(lambda x:(x.bottom_salary+x.top_salary)/2,axis=1)
>>> df1.head()

最后只提取我们的需要的核心数据

>>> df2 = df1[['city','companyShortName','companySize','education',
            'positionName','positionLables','workYear','avg_salary']] // 注意这里两个括号
>>> df2
>>> df2=df2.reset_index()   // 可以将数据行索引变成 0-5030

1.4 数据分析

描述性统计

>>> df2.city.value_counts()   // 统计城市职位需求
北京    2347
上海     979
深圳     527
杭州     406
广州     335
成都     135
南京      83
武汉      69
西安      38
苏州      37
厦门      30
长沙      25
天津      20
Name: city, dtype: int64
>>> df2.describe()    // 只有 avg_salary 数据列为整型数据,故只统计 avg_salary
     avg_salary
count     5031.000000
mean     17.111409
std     8.996242
min     1.500000
25%     11.500000
50%     15.000000
75%     22.500000
max     75.000000

1.5 可视化

Pandas 其实内置了简单的可视化工具

城市工资情况统计:

>>> df2.avg_salary.hist()   // 直方图

>>> df2.boxplot(column='avg_salary',by='city',figsize=(9,7))  // 箱线图

上述箱线图横坐标城市本来为框,显示异常,可填入如下代码使之显示正常。

// 导入相关工具包
>>> import matplotlib.pyplot as plt
>>> %matplotlib inline    // 为了可以直接在 jupyter notebook 中直接输出图表, 其实可以省略
>>> plt.style.use('ggplot')
>>> plt.rcParams['font.sans-serif'] = ['SimHei'] // 指定默认字体
>>> plt.rcParams['axes.unicode_minus'] = False  // 解决保存图像是负号 '-' 显示为方块的问题

职位关键词统计:

>>> df2.positionLables              // 观察 positionLables 列的内容格式
>>> word = df2.positionLables.str[1:-1].replace(' ','')  // 去掉中括号, 去掉空格

>>> df_word=word.dropna().str.split(',').apply(pd.value_counts)  // 统计每个关键词在每行出现的次数

>>> df_word_counts = df_word.unstack().dropna().reset_index().groupby('level_0').count()
// 将 DataFrame 变成 Series,再按照 level_0 统计每个词出现的个数

生成词云图:

>>> from wordcloud import WordCloud
>>> df_word_counts.index = df_word_counts.index.str.replace("'","")
>>> wordcloud = WordCloud(font_path='C:\Windows\Fonts\simsun.ttc',
                          width=900,height=400,
                          background_color='white')

>>> f,axs = plt.subplots(figsize=(15,15))
>>> wordcloud.fit_words(df_word_counts.level_1)
>>> axs = plt.imshow(wordcloud)
>>> plt.axis('off')
>>> plt.show()

![](https://image--1.oss-cn-shenzhen.aliyuncs.com/dhasiudhasud hae34.png)


欢迎各位看官及技术大佬前来交流指导呀,可以邮件至 jqiange@yeah.net