版本 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具有不同的行为,具体取决于切片是被解释为基于位置还是基于标签,因此通常最好明确并使用.ilocor .loc

    请参阅高级索引高级层次结构了解更多信息。

选择弃用#

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

  • irow

  • icol

  • iget_value

请参阅“按位置选择替补”部分。

数据类型#

数字数据类型将传播并可以在 DataFrame 中共存。如果传递了一个数据类型(无论是直接通过关键字dtype、passedndarray还是passed)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]

Dtype 陷阱#

平台陷阱

从 0.11.0 开始,DataFrame/Series 的构造将使用默认的 dtypesint64float64无论平台如何。这与早期版本的 pandas 相比并没有明显的变化。但是,如果您指定 dtypes,它们受到尊重(GH 2837

以下都将产生int64dtypes

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])) int32在 32 位平台上产生结果!

向上转型的陷阱

对整数类型数据执行索引操作可以轻松地向上转换数据。在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

而 float 数据类型则保持不变。

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

日期时间转换#

np.nan除了传统的NaT或非时间之外,DataFrame(或系列)中的 Datetime64[ns] 列还允许使用 来指示 nan 值。这允许以通用方式方便地进行 nan 设置。此外,datetime64[ns]当传递 datetimelike 对象时,默认情况下会创建列(此更改是在 0.10.1 中引入的)(GH 2809GH 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

Astype 转换为datetime64[ns]to object,隐式转换NaTnp.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添加了从表中选择单个列作为系列的方法。

    • 已弃用该unique方法,可以通过以下方式复制select_column(key,column).unique()

    • min_itemsize参数 toappend现在将自动为传递的键创建 data_columns

增强功能#

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

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

  • 瓶颈现在是推荐依赖项,以加速某些类型的nan操作

  • HDFStore

    • 支持read_hdf/to_hdf类似的APIread_csv/to_csv

      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=boolean, 和chunksize=number_in_a_chunk来支持select和 的迭代select_as_multipleGH 3076

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

  • 现在,您可以使用类似于日期索引的 DataFrame 中的字符串进行选择,方式与系列 ( 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 更快)。

    • 当调用创建调用和放置的方法时,会自动创建新的调用和放置实例变量。这适用于实例变量简单为calls和 的当前月份puts。也适用于未来的到期月份,并将实例变量保存为 callsMMYYputsMMYY,其中MMYY分别是期权到期的月份和年份。

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

    • Options.get_forward_data现在有可选的 kwargsnearabove_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以防止针对 1M 行以上的帧计算 verbose_info(可配置)。 (GH 2807GH 2918

  • value_counts() 现在接受“标准化”参数,用于标准化直方图。 (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 字符转义(默认启用)和 escapes&以及<>。 (GH 2919

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

贡献者#

共有 50 人为此版本贡献了补丁。名字带有“+”的人首次贡献了补丁。

  • 亚当·格林霍尔 +

  • 阿尔瓦罗·特赫罗-坎特罗 +

  • 安迪·海登

  • 布拉德·布兰+

  • 常社

  • 萧启文 +

  • 克里斯·威瑟斯 +

  • 克里斯蒂安·盖尔 +

  • 克里斯托弗·惠兰

  • 达米恩·加劳德

  • 丹·伯肯

  • 丹·戴维森 +

  • 迪特·范登布斯切

  • 德拉赞·卢卡宁 +

  • 德拉赞·卢卡宁 +

  • 加勒特·德拉帕拉

  • 伊利亚·波洛苏欣 +

  • 詹姆斯·卡斯本 +

  • 杰夫·雷巴克

  • 杰里米·瓦格纳 +

  • 乔纳森·钱伯斯 +

  • K.-迈克尔·埃伊

  • 卡梅尔·艾利森 +

  • 卢伊克·埃斯特夫 +

  • 尼古拉斯·E·哈勒基 +

  • 彼得·普雷滕霍夫 +

  • 菲利普云+

  • 罗伯特·吉塞克 +

  • 船长西博尔德

  • 斯宾塞·里昂

  • 林史蒂芬+

  • 蒂埃里·莫伊桑 +

  • 托马斯·克鲁弗

  • 蒂姆·阿金博 +

  • 维陶塔斯·扬考斯卡斯

  • 维陶塔斯·扬考斯卡斯 +

  • 韦斯·麦金尼

  • 威尔·弗纳斯 +

  • 沃特·奥弗迈尔

  • 异常耙 +

  • 大卫·詹姆斯·香弗莱斯 +

  • 登格曼+

  • 饮食v77 +

  • 杰雷巴克

  • 词性+

  • 史蒂芬·林 +

  • 索克+

  • 维塔斯+

  • 等待郭+

  • yp