数据分析实战45讲
陈旸
清华大学计算机博士
立即订阅
17314 人已学习
课程目录
已完结 48 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你为什么需要数据分析能力?
免费
第一模块:数据分析基础篇 (16讲)
01丨数据分析全景图及修炼指南
02丨学习数据挖掘的最佳路径是什么?
03丨Python基础语法:开始你的Python之旅
04丨Python科学计算:用NumPy快速处理数据
05丨Python科学计算:Pandas
06 | 学数据分析要掌握哪些基本概念?
07 | 用户画像:标签化就是数据的抽象能力
08 | 数据采集:如何自动化采集数据?
09丨数据采集:如何用八爪鱼采集微博上的“D&G”评论
10丨Python爬虫:如何自动化下载王祖贤海报?
11 | 数据科学家80%时间都花费在了这些清洗任务上?
免费
12 | 数据集成:这些大号一共20亿粉丝?
13 | 数据变换:考试成绩要求正态分布合理么?
14丨数据可视化:掌握数据领域的万金油技能
15丨一次学会Python数据可视化的10种技能
16丨数据分析基础篇答疑
第二模块:数据分析算法篇 (20讲)
17 丨决策树(上):要不要去打篮球?决策树来告诉你
18丨决策树(中):CART,一棵是回归树,另一棵是分类树
19丨决策树(下):泰坦尼克乘客生存预测
20丨朴素贝叶斯分类(上):如何让机器判断男女?
21丨朴素贝叶斯分类(下):如何对文档进行分类?
22丨SVM(上):如何用一根棍子将蓝红两色球分开?
23丨SVM(下):如何进行乳腺癌检测?
24丨KNN(上):如何根据打斗和接吻次数来划分电影类型?
25丨KNN(下):如何对手写数字进行识别?
26丨K-Means(上):如何给20支亚洲球队做聚类?
27丨K-Means(下):如何使用K-Means对图像进行分割?
28丨EM聚类(上):如何将一份菜等分给两个人?
29丨EM聚类(下):用EM算法对王者荣耀英雄进行划分
30丨关联规则挖掘(上):如何用Apriori发现用户购物规则?
31丨关联规则挖掘(下):导演如何选择演员?
32丨PageRank(上):搞懂Google的PageRank算法
33丨PageRank(下):分析希拉里邮件中的人物关系
34丨AdaBoost(上):如何使用AdaBoost提升分类器性能?
35丨AdaBoost(下):如何使用AdaBoost对房价进行预测?
36丨数据分析算法篇答疑
第三模块:数据分析实战篇 (7讲)
37丨数据采集实战:如何自动化运营微博?
38丨数据可视化实战:如何给毛不易的歌曲做词云展示?
39丨数据挖掘实战(1):信用卡违约率分析
40丨数据挖掘实战(2):信用卡诈骗分析
41丨数据挖掘实战(3):如何对比特币走势进行预测?
42丨当我们谈深度学习的时候,我们都在谈什么?
43丨深度学习(下):如何用Keras搭建深度学习网络做手写数字识别?
第四模块:数据分析工作篇 (2讲)
44丨如何培养你的数据分析思维?
45丨求职简历中没有相关项目经验,怎么办?
加餐 (1讲)
加餐丨在社交网络上刷粉刷量,技术上是如何实现的?
结束语 (1讲)
结束语丨当大家都在讲知识和工具的时候,我更希望你重视思维和实战
数据分析实战45讲
登录|注册

05丨Python科学计算:Pandas

陈旸 2018-12-24
上一章中,我们讲了 Python 的一个重要的第三方库 NumPy,今天我来给你介绍 Python 的另一个工具 Pandas。
在数据分析工作中,Pandas 的使用频率是很高的,一方面是因为 Pandas 提供的基础数据结构 DataFrame 与 json 的契合度很高,转换起来就很方便。另一方面,如果我们日常的数据清理工作不是很复杂的话,你通常用几句 Pandas 代码就可以对数据进行规整。
Pandas 可以说是基于 NumPy 构建的含有更高级数据结构和分析能力的工具包。在 NumPy 中数据结构是围绕 ndarray 展开的,那么在 Pandas 中的核心数据结构是什么呢?
下面主要给你讲下 Series 和 DataFrame 这两个核心数据结构,他们分别代表着一维的序列和二维的表结构。基于这两种数据结构,Pandas 可以对数据进行导入、清洗、处理、统计和输出。

数据结构:Series 和 DataFrame

Series 是个定长的字典序列。说是定长是因为在存储的时候,相当于两个 ndarray,这也是和字典结构最大的不同。因为在字典的结构里,元素的个数是不固定的。
Series 有两个基本属性:index 和 values。在 Series 结构中,index 默认是 0,1,2,……递增的整数序列,当然我们也可以自己来指定索引,比如 index=[‘a’, ‘b’, ‘c’, ‘d’]。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《数据分析实战45讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(140)

  • 自导自演
    老师能换3.x版本的吗?一堆2.x问题一直卡着好难受。
    2018-12-28
    8
    73
  • 何楚
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-

    import pandas as pd

    data = {'Chinese': [66, 95, 93, 90, 80, 80], 'English': [65, 85, 92, 88, 90, 90],
            'Math': [None, 98, 96, 77, 90, 90]}
    df = pd.DataFrame(data, index=['张飞', '关羽', '赵云', '黄忠', '典韦', '典韦'],
                      columns=['English', 'Math', 'Chinese'])
    # 去除重复行
    df = df.drop_duplicates()
    # 列名重新排序
    cols = ['Chinese', 'English', 'Math']
    df = df.filter(cols, axis=1)
    # 列名改为中文
    df.rename(columns={'Chinese': '语文', 'English': '英语',
                       'Math': '数学'}, inplace=True)


    def total_score(df):
        df['总分'] = df['语文'] + df['英语'] + df['数学']
        return df


    # 求成绩的和,用老师讲的 apply 方法
    df = df.apply(total_score, axis=1)
    # 或者可以用这个方法求和
    # df['总分'] = df['语文'] + df['英语'] + df['数学']
    # 按照总分排序,从高到低,此时有缺失值
    df.sort_values(['总分'], ascending=[False], inplace=True)
    # 打印显示成绩单信息,张飞有空值
    print(df.isnull().sum())
    print(df.describe())
    print(df)

    # 使用数学成绩均值填充张飞同学的缺失值
    df['数学'].fillna(df['数学'].mean(), inplace=True)
    # 再次求成绩的和并打印显示成绩单情况
    df = df.apply(total_score, axis=1)
    print(df.isnull().sum())
    print(df.describe())
    print(df)

    作者回复: 整理的不错,终于看到张飞的数学成绩 按照平均值来补全的了

    2018-12-24
    2
    46
  • 大萌
    另外推荐一个链接:https://www.cnblogs.com/nxld/p/6756492.html
    很实用,里面记载了许多python常使用的方法
    2018-12-24
    1
    16
  • daydreamer
    """
    Pandas中有Series和DataFrame两种重要的数据结构。
        Series:是一个定长的字典序列。有两个基本属性:index,values
        DataFrame:类似于数据库表的一种数据结构。我们甚至可以像操作数据库表那样对DataFrame数据进行
        连接,合并,查询等等
        常用DataFrame进行数据清晰:用到的发方法有:
            去重删除:drop(),drop_duplicates(),rename()
            去空格:strip(),lstrip(),rstrip()
            变换大小写:upper(),lower(),title()
            改变数据格式:astype()
            查找空值:lsnull
            apply


    """
    from pandas import DataFrame

    # Scores of students
    scores = {'Chinese': [66, 95, 95, 90, 80, 80],
              'English': [65, 85, 92, 80, 90, 90],
              'Math': [None, 98, 96, 77, 90, 90],
              'Total': [None, None, None, None, None, None]}
    df = DataFrame(scores, index=['Zhang Fei', 'Guan Yu', 'Zhao Yun', 'Huang Zhong', 'Dian Wei','Dian Wei'],)

    # Data ckeaning.
    # remove the duplicated record.
    df = df.drop_duplicates()
    # print(df)

    # Calculate the total scores.
    df['Total'] = df.sum(axis=1)
    print(df.describe())

    作者回复: df['Total'] = df.sum(axis=1) 这个求和写的还是挺简洁的

    2018-12-24
    10
  • 大萌
    Pandas最主要的两个数据结构:Series,DataFrame
    Series提供:index,values,map
    DataFrame常用的函数:
    - describe() 统计性描述
    - drop_duplicates() 删除重复行
    - rename(columns=...) 更名
    - dropna() 删除具有空的行
    - isnull() 判断空值
    - fillna() 填充空值
    - apply() 应用函数
    - merge() 合并df
    - value_counts() 统计某列的各类型个数
    - read_excel() to_excel() 读取和保存excel
    - set_index() 设置索引
    - cut 分组

    代码,工具jupyter notebook:
    import pandas as pd
    from pandas import DataFrame,Series
    import numpy as np

    grades = {'Chinese':[66,95,95,90,80,80],'English':[65,85,92,88,90,90],'Math':[np.nan,98,96,77,90,90]} #定义成绩字典
    df1 = DataFrame(grades,index=['zhangfei','guanyu','zhaoyun','huangzhong','machao','machao']) #创建DataFrame

    df1.describe()
    df1.isnull().any() #查看哪一列有空值

    df1.dropna(inplace=True) #去除空值
    df1.drop_duplicates(inplace=True) #去除重复值
    df1.rename(columns={'Chinese':'YuWen','English':'YingYu','Math':'ShuXue'},inplace=True) #更名

    df1['ZongFen'] = df1.YingYu+df1.YuWen+df1.ShuXue #计算总分
    df1
    2018-12-24
    5
  • 舒成
    大家以后放代码时能不能写明自己的软件环境啊,方便交流啊
    2018-12-24
    5
  • 董大琳儿
    都没听懂,感到淡淡的忧伤~~~
    2019-06-20
    4
  • tjcslx
    #!/usr/bin/env python
    # coding: utf-8
    # 使用Jupyter Notebook进行脚本编写

    import pandas as pd
    import numpy as np
    from pandas import DataFrame
    from pandasql import sqldf, load_meat, load_births

    # 创建数据集并进行数据清洗:清除重复的行;
    # 录入数值时,空值用None或np.nan;defaultValues为字段为空时的默认值,姓名字段默认为“无姓名”,成绩字段默认为0
    # 分别使用drop_duplicates和fillna方法进行去重复值及空值填充
    data = {'Name': ['张飞', '关羽', '赵云', '黄忠', '典韦', '典韦'], 'Chinese': [66, 95, 95, 90, 80, 80], 'English': [65, 85, 92, 88, 90, 90], 'Maths': [None, 98, 96, 77, 90, 90]}
    df = DataFrame(data, columns=['Name', 'Chinese', 'English', 'Maths'])
    defaultValues = {'Name': '无姓名', 'Chinese': 0, 'English': 0, 'Maths': 0}
    df = df.drop_duplicates()
    # 按照默认值进行填充
    df = df.fillna(defaultValues)
    # 使用其他学生的平均值对空值进行填充
    # df['Maths'].fillna(df['Maths'].mean(), inplace=True)

    # 使用Pandas SQL进行排序语句编写
    pysqldf = lambda sql: sqldf(sql, globals())
    sql = "select *, Chinese + English + Maths as Total from df order by Chinese + English + Maths desc"
    print(pysqldf(sql))
    2018-12-31
    4
  • 龟仙人
    老师你好,你好像没有在哪里明确说明自己的环境是python2.7的,结果大家的使用环境大多数是3.0的,多多少少会引发一些问题。还有请问,微信群怎么加?
    2019-01-27
    3
  • 七彩星云
    df2['Chinese'].astype('str') #这种写法貌似不行,如果是原始类型是int,再次map调用str.strip 方法的时候会出错,
    改成赋值形式就行了df2['Chinese'] =df2['Chinese'].astype('str')
    2019-01-04
    1
    3
  • Grandia_Z
    照着老师写 df2 = df2.drop(columns=['Chinese']) 这行代码后,返回结果是:
    TypeError Traceback (most recent call last)
    <ipython-input-25-8116650c61ac> in <module>()
    ----> 1 df2 = df2.drop(columns=['Chinese'])

    TypeError: drop() got an unexpected keyword argument 'columns'

    这个什么意思

    作者回复: 我运行没有问题,是正确的。我使用的是py2.7版本,另外你在开头引用了 DataFrame和pandas工具包了么
    你可以联系编辑,加微信群,我帮你看下

    2018-12-24
    2
  • 姜戈
    # -*- coding: utf-8 -*-
    import pandas as pd
    from pandas import Series, DataFrame

    data={'语文':[66, 95, 95, 90, 80, 80],'英语':[65, 85, 92, 88, 90,90], '数学':['', 98, 96, 77, 90, 90]}
    df1 = DataFrame(data, index=['张飞', '关羽', '赵云','刘备','典韦','典韦'], columns=['语文','英语','数学'])
    print df1
    df1 = df1.drop_duplicates()
    print df1

    df = df1.replace(to_replace='', value=0)

    print df

    df['总计']=df['语文']+df['英语']+df['数学']
    df.replace(to_replace=0, value='', inplace=True)
    print df

    作者回复: 整理的OK,基本上清洗的过程都会把重复的行去掉。针对张飞的数学成绩,既可以按照0统计,也可以按照其他人的平均值来统计(考虑可能是统计缺失,而非真正为0)

    2018-12-24
    2
  • mickey
    #!/usr/bin/python
    # vim: set fileencoding:utf-8
    '''
    1.对于下表的数据,请使用Pandas中的DataFrame进行创建,并对数据进行清洗。
    2.同时新增一列“总和”计算每个人的三科成绩之和。
    '''
    import pandas as pd
    from pandas import DataFrame

    # 导入成绩
    data = pd.read_excel(u'成绩表.xlsx')
    df = DataFrame(data)
    print df


    # 求和,并增加一列“总和”
    def addtotal(df):
        df[u'总和'] = df[u'语文'] + df[u'英语'] + df[u'数学']
        return df


    # 清洗为空的数据
    df1 = df.dropna()

    # 清洗重复的数据
    df1 = df1.drop_duplicates()

    # 生成新数据结构
    df1= df1.apply(addtotal, axis=1)
    print(df1)

    作者回复: 简洁,整理的不错
    其实还有一种清洗方法,即针对张飞的情况,数学成绩可以进行补全,比如用其他人的数学成绩平均值

    2018-12-24
    2
  • nrvna
    import pandas as pd

    data = {'Chinese':[66,95,95,90,80,80],'English':[65,85,92,88,90,90],'Math':[None,98,96,77,90,90]}
    df = pd.DataFrame(data, index=['ZhangFei', 'GuanYu', 'ZhaoYun', 'HuangZhong', 'DianWei', 'DianWei'])
    print(df)

    # Delete extra lines,Replace null with 0, Add new column for total
    df = df.drop_duplicates()
    df = df.where(df.notnull(),0)
    # None will change 'Math' column to float, so that we need to clean it back.
    # [[]] is a DataFrame
    df[['Math']] = df[['Math']].astype(int)

    '''
    Method 1: Directly
    '''
    # df['Total'] = df['Chinese'] + df['English'] + df['Math']
    # print(df)

    '''
    Method 2: apply a function
    '''
    def add_column(df):
        df['Total'] = df['Chinese'] + df['English'] + df['Math']
        return df
    df = df.apply(add_column,axis=1)
    print(df)
    2018-12-24
    2
  • GS
    https://github.com/leledada/jupyter/blob/master/PandasTest.ipynb 用Jupter写了一遍。

    pandasql 为什么要 import load_meat, load_births ? 做什么用的?这个我要查一查
    2019-11-13
    1
  • qinggeouye
    import numpy as np
    import pandas as pd

    scores = pd.DataFrame(
        {'姓名': ['张飞', '关羽', '赵云', '黄忠', '典韦', '典韦'], '语文': [66, 95, 95, 90, 80, 80], '英语': [65, 85, 92, 88, 90, 90],
         '数学': [np.NaN, 98, 96, 77, 90, 90], })

    print(scores)

    # 查找空值所在的列
    isNaN = scores.isna().any() # isnull(), isnull().any()
    isNaN = isNaN[isNaN == True]
    print(scores[isNaN.index])

    # 列的平均值填充空值
    for col in isNaN.index:
        scores[col].fillna(scores[col].mean(), inplace=True)
    print(scores)

    # 去除不必要的行(空值)
    # scores = scores.drop(index=[0])
    # scores = scores.dropna()

    # 去除重复行
    scores = scores.drop_duplicates()
    print(scores)

    # 新增一列'总和'
    # scores['总和'] = scores['语文'] + scores['数学'] + scores['英语']
    scores['总和'] = scores.sum(axis=1)
    print(scores)
    2019-11-03
    1
    1
  • DDBG
    老师我想问一下,假如我查找到了一个空值,怎么利用函数,然后利用apply把空值删除,或者重新赋值
    2019-06-11
    1
  • None竟然是浮点型数据....没想到
    2019-03-05
    1
  • 自然
    def sum(df):
        df[u'总和'] = (df[u'语文']+df[u'英语']+ df[u'数学'])
        return df
    df1 = df1.apply(sum, axis=1)
    2018-12-25
    1
  • lingmacker
    def exercise():
        # 1. 对于下表的数据,请使用Pandas中的DataFrame进行创建,并对数据进行清洗。
        # 2. 同时新增一列“总和”计算每个人的三科成绩之和。

        # 列名使用了中文,打印需要列对其的话,则需要设置这两个参数
        pd.set_option('display.unicode.ambiguous_as_wide', True)
        pd.set_option('display.unicode.east_asian_width', True)

        data = {"姓名": ["张飞", "关羽", "赵云", "黄忠", "典韦", "典韦"],
                "语文": [66, 95, 95, 90, 80, 80],
                "英语": [65, 85, 92, 88, 90, 90],
                "数学": [None, 98, 96, 77, 90, 90]}
        
        score_table = pd.DataFrame(data, columns=["姓名", "语文", "英语", "数学"])
        print(score_table, "\n")

        # 除去重复行
        score_table.drop_duplicates(inplace=True)
        print(score_table, "\n")

        # 添加 总分 列
        score_table.fillna(0, inplace=True) # 将NaN替换为0
        score_table["总分"] = score_table["语文"] + score_table["英语"] + score_table["数学"]
        print(score_table)

    作者回复: 整理的不错,清洗张飞的数学成绩的时候,没有唯一答案。也可以用其他人的数学成绩平均值进行补全

    2018-12-24
    1
收起评论
99+
返回
顶部