Python科学计算之Pandas详解

发表于 5年以前  | 总阅读数:923 次

起步

Pandas最初被作为金融数据分析工具而开发出来,因此 pandas 为时间序列分析提供了很好的支持。 Pandas 的名称来自于面板数据(panel data)和python数据分析 (data analysis) 。panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型。

在我看来,对于 Numpy 以及 Matplotlib ,Pandas可以帮助创建一个非常牢固的用于数据挖掘与分析的基础。而Scipy当然是另一个主要的也十分出色的科学计算库。

安装与导入

通过pip进行安装: pip install pandas

导入:


    import pandas as pd

Pandas的数据类型

Pandas基于两种数据类型: series 与 dataframe 。

Series

一个series是一个一维的数据类型,其中每一个元素都有一个标签。类似于Numpy中元素带标签的数组。其中,标签可以是数字或者字符串。


    # coding: utf-8
    import numpy as np
    import pandas as pd

    s = pd.Series([1, 2, 5, np.nan, 6, 8])
    print s

输出:


    0 1.0
    1 2.0
    2 5.0
    3 NaN
    4 6.0
    5 8.0
    dtype: float64

DataFrame

一个dataframe是一个二维的表结构。Pandas的dataframe可以存储许多种不同的数据类型,并且每一个坐标轴都有自己的标签。你可以把它想象成一个series的字典项。

创建一个 DateFrame:


    #创建日期索引序列 
    dates = pd.date_range('20130101', periods=6)
    #创建Dataframe,其中 index 决定索引序列,columns 决定列名
    df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
    print df

输出:


       A  B  C  D
    2013-01-01 -0.334482 0.746019 -2.205026 -0.803878
    2013-01-02 2.007879 1.559073 -0.527997 0.950946
    2013-01-03 -1.053796 0.438214 -0.027664 0.018537
    2013-01-04 -0.208744 -0.725155 -0.395226 -0.268529
    2013-01-05 0.080822 -1.215433 -0.785030 0.977654
    2013-01-06 -0.126459 0.426328 -0.474553 -1.968056

字典创建 DataFrame


    df2 = pd.DataFrame({ 'A' : 1.,
       'B' : pd.Timestamp('20130102'),
       'C' : pd.Series(1,index=list(range(4)),dtype='float32'),
       'D' : np.array([3] * 4,dtype='int32'),
       'E' : pd.Categorical(["test","train","test","train"]),
       'F' : 'foo' })

输出:


     A  B C D E F
    0 1 2013-01-02 1 3 test foo
    1 1 2013-01-02 1 3 train foo
    2 1 2013-01-02 1 3 test foo
    3 1 2013-01-02 1 3 train foo

将文件数据导入Pandas


    df = pd.read_csv("Average_Daily_Traffic_Counts.csv", header = 0)
    df.head()

数据源可以是 英国政府数据 或 美国政府数据 来获取数据源。当然, Kaggle 是另一个好用的数据源。

选择/切片


    # 选择单独的一列,返回 Serires,与 df.A 效果相当。
    df['A']

    # 位置切片
    df[0:3]

    # 索引切片
    df['20130102':'20130104']

    # 通过标签选择
    df.loc[dates[0]]

    # 对多个轴同时通过标签进行选择
    df.loc[:,['A','B']]

    # 获得某一个单元的数据
    df.loc[dates[0],'A']
    # 或者
    df.at[dates[0],'A'] # 速度更快的做法

    # 通过位置进行选择
    df.iloc[3]

    # 切片
    df.iloc[3:5,0:2]

    # 列表选择
    df.iloc[[1,2,4],[0,2]]

    # 获得某一个单元的数据
    df.iloc[1,1]
    # 或者
    df.iat[1,1] # 更快的做法

    # 布尔索引
    df[df.A > 0]

    # 获得大于零的项的数值
    df[df > 0]

    # isin 过滤
    df2[df2['E'].isin(['two','four'])]

赋值


    # 新增一列,根据索引排列
    s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102', periods=6))
    df['F'] = s1

    # 缺省项
    # 在 pandas 中使用 np.nan 作为缺省项的值。
    df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
    df1.loc[dates[0]:dates[1],'E'] = 1

    # 删除所有带有缺省项的行
    df1.dropna(how='any')

    # 填充缺省项
    df1.fillna(value=5)

    # 获得缺省项的布尔掩码
    pd.isnull(df1)

观察操作


    # 观察开头的数据
    df.head()

    # 观察末尾的数据
    df.tail(3)

    # 显示索引
    df.index

    # 显示列
    df.columns

    # 显示底层 numpy 结构
    df.values

    # DataFrame 的基本统计学属性预览
    df.describe()
    """
      A  B  C  D
    count 6.000000 6.000000 6.000000 6.000000 #数量
    mean 0.073711 -0.431125 -0.687758 -0.233103 #平均值
    std 0.843157 0.922818 0.779887 0.973118 #标准差
    min -0.861849 -2.104569 -1.509059 -1.135632 #最小值
    25% -0.611510 -0.600794 -1.368714 -1.076610 #正态分布 25%
    50% 0.022070 -0.228039 -0.767252 -0.386188 #正态分布 50%
    75% 0.658444 0.041933 -0.034326 0.461706 #正态分布 75%
    max 1.212112 0.567020 0.276232 1.071804 #最大值
    """

    # 转置
    df.T

    # 根据某一轴的索引进行排序
    df.sort_index(axis=1, ascending=False)

    # 根据某一列的数值进行排序
    df.sort(columns='B')

统计


    # 求平均值
    df.mean()
    """
    A -0.004474
    B -0.383981
    C -0.687758
    D 5.000000
    F 3.000000
    dtype: float64
    """

    # 指定轴上的平均值
    df.mean(1)

    # 不同维度的 pandas 对象也可以做运算,它会自动进行对应,shift 用来做对齐操作。
    s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2)
    """
    2013-01-01 NaN
    2013-01-02 NaN
    2013-01-03 1
    2013-01-04 3
    2013-01-05 5
    2013-01-06 NaN
    Freq: D, dtype: float64
    """

    # 对不同维度的 pandas 对象进行减法操作
    df.sub(s, axis='index')
    """
       A  B  C D F
    2013-01-01 NaN NaN NaN NaN NaN
    2013-01-02 NaN NaN NaN NaN NaN
    2013-01-03 -1.861849 -3.104569 -1.494929 4 1
    2013-01-04 -2.278445 -3.706771 -4.039575 2 0
    2013-01-05 -5.424972 -4.432980 -4.723768 0 -1
    2013-01-06 NaN NaN NaN NaN NaN
    """

函数应用


    # 累加
    df.apply(np.cumsum)

直方图


    s = pd.Series(np.random.randint(0, 7, size=10))
    s.value_counts()
    """
    4 5
    6 2
    2 2
    1 1
    dtype: int64
    String Methods
    """

字符处理


    s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
    s.str.lower()
    """
    0 a
    1 b
    2 c
    3 aaba
    4 baca
    5 NaN
    6 caba
    7 dog
    8 cat
    dtype: object
    """

合并

使用 concat() 连接 pandas 对象:


    df = pd.DataFrame(np.random.randn(10, 4))
    """
      0  1  2  3
    0 -0.548702 1.467327 -1.015962 -0.483075
    1 1.637550 -1.217659 -0.291519 -1.745505
    2 -0.263952 0.991460 -0.919069 0.266046
    3 -0.709661 1.669052 1.037882 -1.705775
    4 -0.919854 -0.042379 1.247642 -0.009920
    5 0.290213 0.495767 0.362949 1.548106
    6 -1.131345 -0.089329 0.337863 -0.945867
    7 -0.932132 1.956030 0.017587 -0.016692
    8 -0.575247 0.254161 -1.143704 0.215897
    9 1.193555 -0.077118 -0.408530 -0.862495
    """

    pieces = [df[:3], df[3:7], df[7:]]
    pd.concat(pieces)
    """
      0  1  2  3
    0 -0.548702 1.467327 -1.015962 -0.483075
    1 1.637550 -1.217659 -0.291519 -1.745505
    2 -0.263952 0.991460 -0.919069 0.266046
    3 -0.709661 1.669052 1.037882 -1.705775
    4 -0.919854 -0.042379 1.247642 -0.009920
    5 0.290213 0.495767 0.362949 1.548106
    6 -1.131345 -0.089329 0.337863 -0.945867
    7 -0.932132 1.956030 0.017587 -0.016692
    8 -0.575247 0.254161 -1.143704 0.215897
    9 1.193555 -0.077118 -0.408530 -0.862495
    """

join 合并:


    left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
    right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
    pd.merge(left, right, on='key')
    """
     key lval rval
    0 foo 1 4
    1 foo 1 5
    2 foo 2 4
    3 foo 2 5
    """

追加

在 dataframe 数据后追加行


    df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
    s = df.iloc[3]
    df.append(s, ignore_index=True)

分组

分组常常意味着可能包含以下的几种的操作中一个或多个

  • 依据一些标准分离数据
  • 对组单独地应用函数
  • 将结果合并到一个数据结构中

    df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
        'foo', 'bar', 'foo', 'foo'],
       'B' : ['one', 'one', 'two', 'three',
        'two', 'two', 'one', 'three'],
       'C' : np.random.randn(8),
       'D' : np.random.randn(8)})

    # 对单个分组应用函数,数据被分成了 bar 组与 foo 组,分别计算总和。
    df.groupby('A').sum()

    # 依据多个列分组会构成一个分级索引
    df.groupby(['A','B']).sum()
    """
       C  D
    A B   
    bar one -1.814470 2.395985
     three -0.595447 0.166599
     two -0.392670 -0.136473
    foo one -1.195665 -0.616981
     three 1.928123 -1.623033
     two 2.414034 1.600434
    """

数据透视表


    df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,
       'B' : ['A', 'B', 'C'] * 4,
       'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,
       'D' : np.random.randn(12),
       'E' : np.random.randn(12)})

    # 生成数据透视表
    pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])
    """
    C  bar foo
    A B   
    one A -0.773723 1.418757
     B -0.029716 -1.879024
     C -1.146178 0.314665
    three A 1.006160 NaN
     B NaN -1.035018
     C 0.648740 NaN
    two A NaN 0.100900
     B -1.170653 NaN
     C NaN 0.536826
    """

时间序列

pandas 拥有既简单又强大的频率变换重新采样功能,下面的例子从 1次/秒 转换到了 1次/5分钟:


    rng = pd.date_range('1/1/2012', periods=100, freq='S')
    ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
    ts.resample('5Min', how='sum')
    """
    2012-01-01 25083
    Freq: 5T, dtype: int32
    """

    # 本地化时区表示
    rng = pd.date_range('3/6/2012 00:00', periods=5, freq='D')
    ts = pd.Series(np.random.randn(len(rng)), rng)
    """
    2012-03-06 0.464000
    2012-03-07 0.227371
    2012-03-08 -0.496922
    2012-03-09 0.306389
    2012-03-10 -2.290613
    Freq: D, dtype: float64
    """

    ts_utc = ts.tz_localize('UTC')
    """
    2012-03-06 00:00:00+00:00 0.464000
    2012-03-07 00:00:00+00:00 0.227371
    2012-03-08 00:00:00+00:00 -0.496922
    2012-03-09 00:00:00+00:00 0.306389
    2012-03-10 00:00:00+00:00 -2.290613
    Freq: D, dtype: float64
    """

    # 转换为周期
    ps = ts.to_period()

    # 转换为时间戳
    ps.to_timestamp()

分类


    df = pd.DataFrame({"id":[1,2,3,4,5,6], "raw_grade":['a', 'b', 'b', 'a', 'a', 'e']})

    # 将 raw_grades 转换成 Categoricals 类型
    df["grade"] = df["raw_grade"].astype("category")
    df["grade"]
    """
    0 a
    1 b
    2 b
    3 a
    4 a
    5 e
    Name: grade, dtype: category
    Categories (3, object): [a, b, e]
    """

    # 重命名分类
    df["grade"] = df["grade"].cat.set_categories(["very bad", "bad", "medium", "good", "very good"])

    # 根据分类的顺序对数据进行排序
    df.sort("grade")
    """
     id raw_grade  grade
    5 6   e very bad
    1 2   b  good
    2 3   b  good
    0 1   a very good
    3 4   a very good
    4 5   a very good
    """

作图


    ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
    ts = ts.cumsum()
    ts.plot()

数据IO


    # 从 csv 文件读取数据
    pd.read_csv('foo.csv')

    # 保存到 csv 文件
    df.to_csv('foo.csv')

    # 读取 excel 文件
    pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])

    # 保存到 excel 文件
    df.to_excel('foo.xlsx', sheet_name='Sheet1')

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流。

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237276次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8110次阅读
 目录