版本 0.11.0 (2013 年 4 月 22 日)#

这是继 0.10.1 之后的一个主要版本,包含许多新功能、增强功能以及大量错误修复。数据选择方法增加了许多新功能,Dtype 支持也已成熟。此外还有一些重要的 API 更改,pandas 的老用户应密切关注。

文档中新增了一个章节,10 分钟入门 Pandas,主要面向新用户。

文档中新增了一个章节,Cookbook(菜谱),汇集了 pandas 中一些实用的技巧(欢迎贡献!)。

现在有一些库被列为推荐依赖项

选择方法#

从 0.11.0 版本开始,对象选择新增了一些用户请求的功能,以支持更明确的基于位置的索引。pandas 现在支持三种多轴索引方式。

  • .loc 严格基于标签,找不到项目时会引发 KeyError,允许的输入包括:

    • 单个标签,例如 5'a'(请注意,5 在此被解释为索引的一个标签。此用法**不是**索引上的整数位置)

    • 标签列表或数组,例如 ['a', 'b', 'c']

    • 带标签的切片对象,例如 'a':'f'(请注意,与通常的 python 切片不同,**起始和结束**都包含在内!)

    • 布尔数组

    更多详情请参阅按标签选择

  • .iloc 严格基于整数位置(从轴的 0length-1),当请求的索引超出范围时会引发 IndexError。允许的输入包括:

    • 一个整数,例如 5

    • 整数列表或数组,例如 [4, 3, 0]

    • 带整数的切片对象,例如 1:7

    • 布尔数组

    更多详情请参阅按位置选择

  • .ix 支持整数和标签混合访问。它主要基于标签,但会回退到整数位置访问。.ix 是最通用的,支持 .loc.iloc 的任何输入,以及浮点标签方案。处理混合位置和标签的分层索引时,.ix 尤其有用。

    由于使用整数切片与 .ix 时,其行为会根据切片是基于位置还是基于标签解释而有所不同,通常最好明确使用 .iloc.loc

    更多详情请参阅高级索引高级分层索引

选择方法弃用#

从 0.11.0 版本开始,这些方法在未来版本中*可能*被弃用。

  • irow

  • icol

  • iget_value

请参阅按位置选择章节以查找替代方法。

数据类型#

数值型数据类型 (numeric dtypes) 会传播,并可在 DataFrame 中共存。如果传入了数据类型(通过 dtype 关键字直接指定、传入 ndarray 或传入 Series),那么它将在 DataFrame 操作中保留。此外,不同的数值型数据类型**不会**合并。下面的示例将为您提供一个初步了解。

In [1]: df1 = pd.DataFrame(np.random.randn(8, 1), columns=['A'], dtype='float32')

In [2]: df1
Out[2]: 
          A
0  0.469112
1 -0.282863
2 -1.509058
3 -1.135632
4  1.212112
5 -0.173215
6  0.119209
7 -1.044236

In [3]: df1.dtypes
Out[3]: 
A    float32
dtype: object

In [4]: df2 = pd.DataFrame({'A': pd.Series(np.random.randn(8), dtype='float16'),
   ...:                     'B': pd.Series(np.random.randn(8)),
   ...:                     'C': pd.Series(range(8), dtype='uint8')})
   ...: 

In [5]: df2
Out[5]: 
          A         B  C
0 -0.861816 -0.424972  0
1 -2.105469  0.567020  1
2 -0.494873  0.276232  2
3  1.072266 -1.087401  3
4  0.721680 -0.673690  4
5 -0.706543  0.113648  5
6 -1.040039 -1.478427  6
7  0.271973  0.524988  7

In [6]: df2.dtypes
Out[6]: 
A    float16
B    float64
C      uint8
dtype: object

# here you get some upcasting
In [7]: df3 = df1.reindex_like(df2).fillna(value=0.0) + df2

In [8]: df3
Out[8]: 
          A         B    C
0 -0.392704 -0.424972  0.0
1 -2.388332  0.567020  1.0
2 -2.003932  0.276232  2.0
3 -0.063367 -1.087401  3.0
4  1.933792 -0.673690  4.0
5 -0.879758  0.113648  5.0
6 -0.920830 -1.478427  6.0
7 -0.772263  0.524988  7.0

In [9]: df3.dtypes
Out[9]: 
A    float32
B    float64
C    float64
dtype: object

数据类型转换#

这是最低公分母向上转型,意味着您将获得可以容纳所有类型的数据类型

In [10]: df3.values.dtype
Out[10]: dtype('float64')

转换

In [11]: df3.astype('float32').dtypes
Out[11]: 
A    float32
B    float32
C    float32
dtype: object

混合转换

In [12]: df3['D'] = '1.'

In [13]: df3['E'] = '1'

In [14]: df3.convert_objects(convert_numeric=True).dtypes
Out[14]:
A    float32
B    float64
C    float64
D    float64
E      int64
dtype: object

# same, but specific dtype conversion
In [15]: df3['D'] = df3['D'].astype('float16')

In [16]: df3['E'] = df3['E'].astype('int32')

In [17]: df3.dtypes
Out[17]:
A    float32
B    float64
C    float64
D    float16
E      int32
dtype: object

强制日期类型转换(非日期类型时设为 NaT

In [18]: import datetime

In [19]: s = pd.Series([datetime.datetime(2001, 1, 1, 0, 0), 'foo', 1.0, 1,
   ....:                pd.Timestamp('20010104'), '20010105'], dtype='O')
   ....:

In [20]: s.convert_objects(convert_dates='coerce')
Out[20]:
0   2001-01-01
1          NaT
2          NaT
3          NaT
4   2001-01-04
5   2001-01-05
dtype: datetime64[ns]

数据类型注意事项#

平台注意事项

从 0.11.0 版本开始,构造 DataFrame/Series 时将使用默认数据类型 int64float64,**无论平台如何**。这与早期版本的 pandas 没有明显变化。但是,如果您指定了数据类型,它们**将**被遵守 (GH 2837)

以下都将导致 int64 数据类型

In [21]: pd.DataFrame([1, 2], columns=['a']).dtypes
Out[21]:
a    int64
dtype: object

In [22]: pd.DataFrame({'a': [1, 2]}).dtypes
Out[22]:
a    int64
dtype: object

In [23]: pd.DataFrame({'a': 1}, index=range(2)).dtypes
Out[23]:
a    int64
dtype: object

请记住,DataFrame(np.array([1,2])) 在 32 位平台上**将**导致 int32 数据类型!

向上转型注意事项

对整数类型数据执行索引操作很容易导致数据向上转型。在不引入 nans 值的情况下,输入数据的数据类型将得到保留。

In [24]: dfi = df3.astype('int32')

In [25]: dfi['D'] = dfi['D'].astype('int64')

In [26]: dfi
Out[26]:
  A  B  C  D  E
0  0  0  0  1  1
1 -2  0  1  1  1
2 -2  0  2  1  1
3  0 -1  3  1  1
4  1  0  4  1  1
5  0  0  5  1  1
6  0 -1  6  1  1
7  0  0  7  1  1

In [27]: dfi.dtypes
Out[27]:
A    int32
B    int32
C    int32
D    int64
E    int32
dtype: object

In [28]: casted = dfi[dfi > 0]

In [29]: casted
Out[29]:
    A   B    C  D  E
0  NaN NaN  NaN  1  1
1  NaN NaN  1.0  1  1
2  NaN NaN  2.0  1  1
3  NaN NaN  3.0  1  1
4  1.0 NaN  4.0  1  1
5  NaN NaN  5.0  1  1
6  NaN NaN  6.0  1  1
7  NaN NaN  7.0  1  1

In [30]: casted.dtypes
Out[30]:
A    float64
B    float64
C    float64
D      int64
E      int32
dtype: object

而浮点数据类型则不变。

In [31]: df4 = df3.copy()

In [32]: df4['A'] = df4['A'].astype('float32')

In [33]: df4.dtypes
Out[33]:
A    float32
B    float64
C    float64
D    float16
E      int32
dtype: object

In [34]: casted = df4[df4 > 0]

In [35]: casted
Out[35]:
          A         B    C    D  E
0       NaN       NaN  NaN  1.0  1
1       NaN  0.567020  1.0  1.0  1
2       NaN  0.276232  2.0  1.0  1
3       NaN       NaN  3.0  1.0  1
4  1.933792       NaN  4.0  1.0  1
5       NaN  0.113648  5.0  1.0  1
6       NaN       NaN  6.0  1.0  1
7       NaN  0.524988  7.0  1.0  1

In [36]: casted.dtypes
Out[36]:
A    float32
B    float64
C    float64
D    float16
E      int32
dtype: object

日期时间转换#

DataFrame(或 Series)中的 Datetime64[ns] 列除了传统的 NaT(非时间)外,还允许使用 np.nan 表示 nan 值。这使得以通用方式方便地设置 nan 值成为可能。此外,当传入类日期时间对象时,默认会创建 datetime64[ns] 列(此更改在 0.10.1 版本引入)(GH 2809, GH 2810)

In [12]: df = pd.DataFrame(np.random.randn(6, 2), pd.date_range('20010102', periods=6),
   ....:                   columns=['A', ' B'])
   ....: 

In [13]: df['timestamp'] = pd.Timestamp('20010103')

In [14]: df
Out[14]: 
                   A         B  timestamp
2001-01-02  0.404705  0.577046 2001-01-03
2001-01-03 -1.715002 -1.039268 2001-01-03
2001-01-04 -0.370647 -1.157892 2001-01-03
2001-01-05 -1.344312  0.844885 2001-01-03
2001-01-06  1.075770 -0.109050 2001-01-03
2001-01-07  1.643563 -1.469388 2001-01-03

# datetime64[ns] out of the box
In [15]: df.dtypes.value_counts()
Out[15]: 
float64          2
datetime64[s]    1
Name: count, dtype: int64

# use the traditional nan, which is mapped to NaT internally
In [16]: df.loc[df.index[2:4], ['A', 'timestamp']] = np.nan

In [17]: df
Out[17]: 
                   A         B  timestamp
2001-01-02  0.404705  0.577046 2001-01-03
2001-01-03 -1.715002 -1.039268 2001-01-03
2001-01-04       NaN -1.157892        NaT
2001-01-05       NaN  0.844885        NaT
2001-01-06  1.075770 -0.109050 2001-01-03
2001-01-07  1.643563 -1.469388 2001-01-03

datetime64[ns] 通过 astype 转换为 object 时,会将 NaT 隐式转换为 np.nan

In [18]: import datetime

In [19]: s = pd.Series([datetime.datetime(2001, 1, 2, 0, 0) for i in range(3)])

In [20]: s.dtype
Out[20]: dtype('<M8[ns]')

In [21]: s[1] = np.nan

In [22]: s
Out[22]: 
0   2001-01-02
1          NaT
2   2001-01-02
dtype: datetime64[ns]

In [23]: s.dtype
Out[23]: dtype('<M8[ns]')

In [24]: s = s.astype('O')

In [25]: s
Out[25]: 
0    2001-01-02 00:00:00
1                    NaT
2    2001-01-02 00:00:00
dtype: object

In [26]: s.dtype
Out[26]: dtype('O')

API 变更#

  • 为索引添加了 to_series() 方法,以便于创建索引器 (GH 3275)

  • HDFStore

    • 添加了 select_column 方法,用于从表中选择单列作为 Series。

    • 弃用了 unique 方法,可通过 select_column(key,column).unique() 实现相同功能

    • append 方法的 min_itemsize 参数现在将自动为传入的键创建 data_columns

增强功能#

  • 在某些情况下,df.to_csv() 的性能提升了高达 10 倍。(GH 3059)

  • Numexpr 现在是推荐依赖项,用于加速某些类型的数值和布尔运算

  • Bottleneck 现在是推荐依赖项,用于加速某些类型的 nan 操作

  • HDFStore

    • 支持类似于 read_csv/to_csvread_hdf/to_hdf API

      In [27]: df = pd.DataFrame({'A': range(5), 'B': range(5)})
      
      In [28]: df.to_hdf('store.h5', key='table', append=True)
      
      In [29]: pd.read_hdf('store.h5', 'table', where=['index > 2'])
      Out[29]: 
         A  B
      3  3  3
      4  4  4
      
    • 提供通过点号访问 store 的 get 方法,例如 store.df == store['df']

    • 提供了新的关键字 iterator=booleanchunksize=number_in_a_chunk,以支持对 selectselect_as_multiple 进行迭代 (GH 3076)

  • 现在可以从无序时间序列中选择时间戳,与有序时间序列类似 (GH 2437)

  • 现在可以从带有类日期索引的 DataFrame 中使用字符串进行选择,类似于 Series (GH 3070)

    In [30]: idx = pd.date_range("2001-10-1", periods=5, freq='M')
    
    In [31]: ts = pd.Series(np.random.rand(len(idx)), index=idx)
    
    In [32]: ts['2001']
    Out[32]:
    2001-10-31    0.117967
    2001-11-30    0.702184
    2001-12-31    0.414034
    Freq: M, dtype: float64
    
    In [33]: df = pd.DataFrame({'A': ts})
    
    In [34]: df['2001']
    Out[34]:
                       A
    2001-10-31  0.117967
    2001-11-30  0.702184
    2001-12-31  0.414034
    
  • Squeeze 可能移除对象的长度为 1 的维度。

    >>> p = pd.Panel(np.random.randn(3, 4, 4), items=['ItemA', 'ItemB', 'ItemC'],
    ...              major_axis=pd.date_range('20010102', periods=4),
    ...              minor_axis=['A', 'B', 'C', 'D'])
    >>> p
    <class 'pandas.core.panel.Panel'>
    Dimensions: 3 (items) x 4 (major_axis) x 4 (minor_axis)
    Items axis: ItemA to ItemC
    Major_axis axis: 2001-01-02 00:00:00 to 2001-01-05 00:00:00
    Minor_axis axis: A to D
    
    >>> p.reindex(items=['ItemA']).squeeze()
                       A         B         C         D
    2001-01-02  0.926089 -2.026458  0.501277 -0.204683
    2001-01-03 -0.076524  1.081161  1.141361  0.479243
    2001-01-04  0.641817 -0.185352  1.824568  0.809152
    2001-01-05  0.575237  0.669934  1.398014 -0.399338
    
    >>> p.reindex(items=['ItemA'], minor=['B']).squeeze()
    2001-01-02   -2.026458
    2001-01-03    1.081161
    2001-01-04   -0.185352
    2001-01-05    0.669934
    Freq: D, Name: B, dtype: float64
    
  • pd.io.data.Options 中,

    • 修复了尝试获取当前月份数据时,如果已过到期日期则出现的错误。

    • 现在使用 lxml 而不是 BeautifulSoup 来抓取 html (lxml 速度更快)。

    • 当调用创建 calls 和 puts 的方法时,会自动创建新的实例变量。对于当前月份,实例变量只是 callsputs。对于未来到期月份,实例变量保存为 callsMMYYputsMMYY,其中 MMYY 分别是期权的到期月份和年份。

    • Options.get_near_stock_price 现在允许用户指定获取相关期权数据的月份。

    • Options.get_forward_data 现在包含可选的 kwargs nearabove_below。这允许用户指定是否只返回接近当前股价的期权的前瞻性数据。这只是从 Options.get_near_stock_price 获取数据,而不是 Options.get_xxx_data() (GH 2758)。

  • 时间序列图中现在显示光标坐标信息。

  • 添加了选项 display.max_seq_items,用于控制每个序列 pretty-print 时打印的元素数量。(GH 2979)

  • 添加了选项 display.chop_threshold,用于控制微小数值的显示。(GH 2739)

  • 添加了选项 display.max_info_rows,以防止对行数超过 1M 的 frame 计算 verbose_info(可配置)。(GH 2807, GH 2918)

  • value_counts() 现在接受“normalize”参数,用于标准化直方图。(GH 2710)。

  • DataFrame.from_records 现在不仅接受 dict,还接受 collections.Mapping ABC 的任何实例。

  • 添加了选项 display.mpl_style,为绘图提供更简洁的视觉风格。基于 https://gist.github.com/huyng/816622 (GH 3075)。

  • 在数值运算中将布尔值视为整数(值 1 和 0)。(GH 2641)

  • to_html() 现在接受可选的“escape”参数,用于控制保留 HTML 字符转义(默认为启用),并除了 <> 之外,还转义 &。(GH 2919)

完整列表请参阅完整的发布说明或 GitHub 上的问题跟踪器。

贡献者#

共有 50 人为本次发布贡献了补丁。名字旁带有“+”的人是首次贡献补丁。

  • Adam Greenhall +

  • Alvaro Tejero-Cantero +

  • Andy Hayden

  • Brad Buran +

  • Chang She

  • Chapman Siu +

  • Chris Withers +

  • Christian Geier +

  • Christopher Whelan

  • Damien Garaud

  • Dan Birken

  • Dan Davison +

  • Dieter Vandenbussche

  • Dražen Lučanin +

  • Dražen Lučanin +

  • Garrett Drapala

  • Illia Polosukhin +

  • James Casbon +

  • Jeff Reback

  • Jeremy Wagner +

  • Jonathan Chambers +

  • K.-Michael Aye

  • Karmel Allison +

  • Loïc Estève +

  • Nicholaus E. Halecky +

  • Peter Prettenhofer +

  • Phillip Cloud +

  • Robert Gieseke +

  • Skipper Seabold

  • Spencer Lyon

  • Stephen Lin +

  • Thierry Moisan +

  • Thomas Kluyver

  • Tim Akinbo +

  • Vytautas Jancauskas

  • Vytautas Jančauskas +

  • Wes McKinney

  • Will Furnass +

  • Wouter Overmeire

  • anomrake +

  • davidjameshumphreys +

  • dengemann +

  • dieterv77 +

  • jreback

  • lexual +

  • stephenwlin +

  • thauck +

  • vytas +

  • waitingkuo +

  • y-p