• Pandas 快速入门教程


    Pandas 概览

    PandasPythonopen in new window 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具。经过多年不懈的努力,Pandas 离这个目标已经越来越近了。

    Pandas 适用于处理以下类型的数据:

    • 与 SQL 或 Excel 表类似的,含异构列的表格数据;

    • 有序和无序(非固定频率)的时间序列数据;

    • 带行列标签的矩阵数据,包括同构或异构型数据;

    • 任意其它形式的观测、统计数据集, 数据转入 Pandas 数据结构时不必事先标记。

    Pandas 的主要数据结构是 Seriesopen in new window(一维数据)与 DataFrameopen in new window(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。对于 R 用户,DataFrame 提供了比 R 语言 data.frame 更丰富的功能。Pandas 基于 NumPyopen in new window 开发,可以与其它第三方科学计算支持库完美集成。

    Pandas 就像一把万能瑞士军刀,下面仅列出了它的部分优势 :

    • 处理浮点与非浮点数据里的缺失数据,表示为 NaN

    • 大小可变:插入或删除 DataFrame 等多维对象的列;

    • 自动、显式数据对齐:显式地将对象与一组标签对齐,也可以忽略标签,在 Series、DataFrame 计算时自动与数据对齐;

    • 强大、灵活的分组(group by)功能:拆分-应用-组合数据集,聚合、转换数据;

    • Python 和 NumPy 数据结构里不规则、不同索引的数据轻松地转换为 DataFrame 对象;

    • 基于智能标签,对大型数据集进行切片花式索引子集分解等操作;

    • 直观地合并(merge)连接(join)数据集;

    • 灵活地重塑(reshape)透视(pivot)数据集;

    • 支持结构化标签:一个刻度支持多个标签;

    • 成熟的 IO 工具:读取文本文件(CSV 等支持分隔符的文件)、Excel 文件、数据库等来源的数据,利用超快的 HDF5 格式保存 / 加载数据;

    • 时间序列:支持日期范围生成、频率转换、移动窗口统计、移动窗口线性回归、日期位移等时间序列功能。

    这些功能主要是为了解决其它编程语言、科研环境的痛点。处理数据一般分为几个阶段:数据整理与清洗、数据分析与建模、数据可视化与制表,Pandas 是处理数据的理想工具。

    其它说明:

    • Pandas 速度很快。Pandas 的很多底层算法都用 Cythonopen in new window 优化过。然而,为了保持通用性,必然要牺牲一些性能,如果专注某一功能,完全可以开发出比 Pandas 更快的专用工具。

    • Pandas 是 statsmodelsopen in new window 的依赖项,因此,Pandas 也是 Python 中统计计算生态系统的重要组成部分。

    • Pandas 已广泛应用于金融领域。

    数据结构

    维数 名称 描述
    1 Series 带标签的一维同构数组
    2 DataFrame 带标签的,大小可变的,二维异构表格

    为什么有多个数据结构?

    Pandas 数据结构就像是低维数据的容器。比如,DataFrame 是 Series 的容器,Series 则是标量的容器。使用这种方式,可以在容器中以字典的形式插入或删除对象。

    此外,通用 API 函数的默认操作要顾及时间序列与截面数据集的方向。多维数组存储二维或三维数据时,编写函数要注意数据集的方向,这对用户来说是一种负担;如果不考虑 C 或 Fortran 中连续性对性能的影响,一般情况下,不同的轴在程序里其实没有什么区别。Pandas 里,轴的概念主要是为了给数据赋予更直观的语义,即用“更恰当”的方式表示数据集的方向。这样做可以让用户编写数据转换函数时,少费点脑子。

    处理 DataFrame 等表格数据时,index(行)或 columns(列)比 axis 0axis 1 更直观。用这种方式迭代 DataFrame 的列,代码更易读易懂:

    1. for col in df.columns:
    2.    series = df[col]
    3.    # do something with series
    4. import pandas as pd
    5. import random
    6. from faker import Faker
    7. from openpyxl import Workbook
    8. # 创建虚假数据生成器
    9. fake = Faker()
    10. # 创建一个数据帧,生成虚假数据
    11. n=1000
    12. data = {
    13.    '姓名': [fake.name() for _ in range(n)],
    14.    '电子邮件': [fake.email() for _ in range(n)],
    15.    '电话号码': [fake.phone_number() for _ in range(n)],
    16.    '地址': [fake.address() for _ in range(n)],
    17.    '工资': [random.randint(1000,10000) for _ in range(n)]
    18. }
    19. df = pd.DataFrame(data)
    20. # 创建一个Excel工作簿并将数据写入工作表
    21. wb = Workbook()
    22. ws = wb.active
    23. # 将数据帧的列标题写入工作表的第一行
    24. for col, column_name in enumerate(df.columns, start=1):
    25.    ws.cell(row=1, column=col, value=column_name)
    26. # 将数据写入工作表
    27. for row, record in enumerate(df.values, start=2):
    28.    for col, value in enumerate(record, start=1):
    29.        ws.cell(row=row, column=col, value=value)
    30. # 保存Excel文件
    31. wb.save('虚假数据.xlsx')
    32. df=pd.read_excel('虚假数据.xlsx')
    33. for col in df.columns:
    34.    series = df[col]
    35.    print(col,series)
    36. 姓名 0                  Susan Ortiz
    37. 1              Bryan Patterson
    38. 2                Betty Stevens
    39. 3                  Tina Mendez
    40. 4                Edward Miller
    41.                ...          
    42. 995                Maria Davis
    43. 996        Stephanie Underwood
    44. 997            Nicole Robinson
    45. 998    Mr. Charles Lawrence MD
    46. 999             Angela Johnson
    47. Name: 姓名, Length: 1000, dtype: object
    48. 电子邮件 0             jeffrey05@example.net
    49. 1             xdavidson@example.com
    50. 2              henrykey@example.net
    51. 3               gchaney@example.com
    52. 4                awatts@example.org
    53.                   ...            
    54. 995              kheath@example.com
    55. 996        loriwilliams@example.org
    56. 997               wmann@example.com
    57. 998    margaretfriedman@example.org
    58. 999             hrivers@example.net
    59. Name: 电子邮件, Length: 1000, dtype: object
    60. 电话号码 0       (551)885-6301x47608
    61. 1                 1430520935
    62. 2       001-117-798-3751x241
    63. 3          701.251.0146x3110
    64. 4          180-238-9727x8554
    65.               ...          
    66. 995         340-283-5841x845
    67. 996       (668)810-5237x874
    68. 997           (844)113-8337
    69. 998    001-563-272-0102x6982
    70. 999       914-902-3095x90088
    71. Name: 电话号码, Length: 1000, dtype: object
    72. 地址 0      9266 Abbott Burg Suite 758\nNorth Stephanie, I...
    73. 1       439 Gonzalez Turnpike\nWest Zoechester, PA 51406
    74. 2      56319 Matthew Estate Apt. 619\nNorth Michael, ...
    75. 3                 4664 Dawson Burgs\nLongmouth, MH 51592
    76. 4      485 Rogers Prairie Suite 472\nPearsonmouth, MP...
    77.                             ...                        
    78. 995    78764 Jennifer Squares Suite 495\nAimeetown, V...
    79. 996     739 Donald Mill Apt. 480\nJenniferstad, CT 56683
    80. 997         540 Christine Shoals\nRichardsview, IA 65480
    81. 998    20154 Craig Path Suite 691\nPetersonland, SD 8...
    82. 999    0537 Rebecca Lock Apt. 835\nLindsayport, MA 44282
    83. Name: 地址, Length: 1000, dtype: object
    84. 工资 0      9183
    85. 1      3573
    86. 2      7649
    87. 3      3934
    88. 4      1371
    89.       ...
    90. 995    3751
    91. 996    2966
    92. 997    7967
    93. 998    3144
    94. 999    4289
    95. Name: 工资, Length: 1000, dtype: int64

    大小可变与数据复制

    Pandas 所有数据结构的值都是可变的,但数据结构的大小并非都是可变的,比如,Series 的长度不可改变,但 DataFrame 里就可以插入列。

    Pandas 里,绝大多数方法都不改变原始的输入数据,而是复制数据,生成新的对象。 一般来说,原始输入数据不变更稳妥。

    十分钟入门 Pandas

    本节是帮助 Pandas 新手快速上手的简介。烹饪指南里介绍了更多实用案例。

    本节以下列方式导入 Pandas 与 NumPy:

    In [1]: import numpy as np
    ​
    In [2]: import pandas as pd

    生成对象

    详见数据结构简介文档。

    用值列表生成 Seriesopen in new window 时,Pandas 默认自动生成整数索引:

    1. In [3]: s = pd.Series([1, 3, 5, np.nan, 6, 8])
    2. In [4]: s
    3. Out[4]:
    4. 0    1.0
    5. 1    3.0
    6. 2    5.0
    7. 3    NaN
    8. 4    6.0
    9. 5    8.0
    10. dtype: float64
    11. 用含日期时间索引与标签的 NumPy 数组生成 DataFrameopen in new window:
    12. dates = pd.date_range('20130101', periods=6)
    13. print(dates)
    14. df=pd.DataFrame(np.random.random((6,5)),index=dates,columns=list('ABCDE'))
    15. print(df)
    16. DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
    17.               '2013-01-05', '2013-01-06'],
    18.              dtype='datetime64[ns]', freq='D')
    19.                   A         B         C         D         E
    20. 2013-01-01  0.821722  0.838978  0.684531  0.867492  0.084755
    21. 2013-01-02  0.784795  0.971571  0.509171  0.046268  0.806170
    22. 2013-01-03  0.546673  0.073271  0.738921  0.297711  0.735907
    23. 2013-01-04  0.621592  0.403766  0.802696  0.109643  0.171212
    24. 2013-01-05  0.469991  0.893711  0.461032  0.326327  0.424273
    25. 2013-01-06  0.680158  0.605057  0.230274  0.458527  0.647544
    26. 用 Series 字典对象生成 DataFrame:
    27. In [9]: df2 = pd.DataFrame({'A': 1.,
    28.   ...:                     'B': pd.Timestamp('20130102'),
    29.   ...:                     'C': pd.Series(1, index=list(range(4)), dtype='float32'),
    30.   ...:                     'D': np.array([3] * 4, dtype='int32'),
    31.   ...:                     'E': pd.Categorical(["test", "train", "test", "train"]),
    32.   ...:                     'F': 'foo'})
    33.   ...:
    34. In [10]: df2
    35. Out[10]:
    36.     A          B    C  D      E    F
    37. 0  1.0 2013-01-02  1.0  3   test  foo
    38. 1  1.0 2013-01-02  1.0  3  train  foo
    39. 2  1.0 2013-01-02  1.0  3   test  foo
    40. 3  1.0 2013-01-02  1.0  3  train  foo
    41. DataFrame 的列有不同数据类型open in new window。
    42. In [11]: df2.dtypes
    43. Out[11]:
    44. A           float64
    45. B    datetime64[ns]
    46. C           float32
    47. D             int32
    48. E          category
    49. F            object
    50. dtype: object
    51. IPython支持 tab 键自动补全列名与公共属性。下面是部分可自动补全的属性:
    52. In [12]: df2.  # noqa: E225, E999
    53. df2.A                  df2.bool
    54. df2.abs                df2.boxplot
    55. df2.add                df2.C
    56. df2.add_prefix         df2.clip
    57. df2.add_suffix         df2.clip_lower
    58. df2.align              df2.clip_upper
    59. df2.all                df2.columns
    60. df2.any                df2.combine
    61. df2.append             df2.combine_first
    62. df2.apply              df2.compound
    63. df2.applymap           df2.consolidate
    df2.D

    列 A、B、C、D 和 E 都可以自动补全;为简洁起见,此处只显示了部分属性。

    查看数据

    详见基础用法open in new window文档。

    下列代码说明如何查看 DataFrame 头部和尾部数据:

    1. In [13]: df.head()
    2. Out[13]:
    3.                   A         B         C         D
    4. 2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
    5. 2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    6. 2013-01-03 -0.861849 -2.104569 -0.49492
  • 相关阅读:
    服务治理--Eureka
    4大软件测试策略的特点和区别(单元测试、集成测试、确认测试和系统测试)
    这几本书看了之后在工作生活上都是有用的
    2022年海外电商运营三大关键讲解
    文件访问:C/C++/MFC
    在 C++ STL 中复制的不同方法 | std::copy()、copy_n()、copy_if()、copy_backward()
    QML(25)——文本输入框组件的区别(TextField TextInput TextArea TextEdit)
    复制控制 copy control(非平凡的类)
    Linux常用操作集合(二)
    第8章_聚合函数
  • 原文地址:https://blog.csdn.net/m0_61634551/article/details/133895397