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

这是从0.10.1版本以来的一个重大发布,包括许多新功能和增强功能,以及大量错误修复。选择数据的方法有了相当多的增加,Dtype支持现在已全面展开。还有一些重要的API变化,长期使用pandas的用户应密切关注。

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

文档中有一个新章节,食谱,这是 pandas 中有用的配方集合(并且我们希望有贡献!)。

现在有几个库是 推荐的依赖项

选择项#

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

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

    • 一个单独的标签,例如 5'a' ,(注意 5 被解释为索引的 标签 。这种用法 不是 索引中的整数位置)

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

    • 带有标签 'a':'f' 的切片对象,(注意,与通常的 python 切片不同,两者 起始和结束都包含!)

    • 一个布尔数组

    更多信息请参见 按标签选择

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

    • 一个整数,例如 5

    • 一个整数列表或数组 [4, 3, 0]

    • 一个包含整数的切片对象 1:7

    • 一个布尔数组

    更多信息请参见 按位置选择

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

    由于使用整数切片与 .ix 的行为取决于切片是基于位置还是基于标签解释,通常最好明确使用 .iloc.loc

    更多信息请参见 高级索引高级层次结构

选择弃用#

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

  • irow

  • icol

  • iget_value

请参见章节 按位置选择 以获取替代方案。

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    float32
dtype: object

Dtype 转换#

这是一种向下兼容的上转换,意味着你会得到一个可以容纳所有类型的 dtype

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]

Dtype 陷阱#

平台陷阱

从 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 的情况下,输入数据的 dtype 将被保留。

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] 列允许使用 np.nan 来表示 nan 值,除了传统的 NaT 或 not-a-time。这允许以通用方式方便地设置 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]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[us]')

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

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

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

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() 来实现

    • min_itemsize 参数到 append 现在会自动为传递的键创建 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
      
    • 提供从存储中 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 来抓取 HTML 而不是 BeautifulSoup(lxml 更快)。

    • 当调用创建它们的某个方法时,会自动为看涨期权和看跌期权创建新的实例变量。这适用于当前月份,实例变量简单地命名为 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 以控制每个序列在打印时显示的元素数量。 (GH 2979)

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

  • 添加了选项 display.max_info_rows 以防止为超过 100 万行(可配置)的帧计算 verbose_info。(GH 2807, GH 2918)

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

  • DataFrame.from_records 现在不仅接受字典,还接受 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