版本 0.13.0 (2014年1月3日)#

这是从 0.12.0 发布的一个主要版本,包括一些 API 变更、几个新功能和增强功能,以及大量错误修复。

亮点包括:

  • 支持新的索引类型 Float64Index,以及其他索引增强功能

  • HDFStore 有一个新的基于字符串的查询规范语法

  • 对新的插值方法的支持

  • 更新的 timedelta 操作

  • 一个新的字符串操作方法 extract

  • 纳秒支持偏移量

  • isin 用于 DataFrame

添加了几个实验性功能,包括:

  • 用于表达式求值的新 eval/query 方法

  • msgpack 序列化的支持

  • 一个与 Google 的 BigQuery 的 i/o 接口

有几个新的或更新的文档部分,包括:

  • 与SQL的比较,这对于那些熟悉SQL但仍在学习pandas的人来说应该是有用的。

  • 与 R 的比较,从 R 到 pandas 的惯用翻译。

  • 增强性能,使用 eval/query 增强 pandas 性能的方法。

警告

在0.13.0版本中,Series 内部已被重构,不再继承 ndarray,而是继承 NDFrame,与其他pandas容器类似。这应该是一个透明的变化,只有非常有限的API影响。请参见 内部重构

API 变化#

  • read_excel 现在支持在其 sheetname 参数中使用整数,以指定要读取的工作表索引 (GH 4301)。

  • 文本解析器现在将任何看起来像 inf 的内容(如 “inf”, “Inf”, “-Inf”, “iNf” 等)视为无穷大。(GH 4220, GH 4219),影响 read_table, read_csv 等。

  • pandas 现在无需 2to3 即可兼容 Python 2/3,这要归功于 @jtratner。因此,pandas 现在更广泛地使用迭代器。这也导致了 Benjamin Peterson 的 six 库的实质部分被引入到 compat 中。(GH 4384, GH 4375, GH 4372)

  • pandas.util.compatpandas.util.py3compat 已经合并到 pandas.compat 中。pandas.compat 现在包含许多允许2/3兼容的函数。它包含范围、过滤、映射和压缩的列表和迭代器版本,以及其他必要的Python 3兼容元素。lmaplziplrangelfilter 都生成列表而不是迭代器,以与 numpy、下标和 pandas 构造函数兼容。(GH 4384, GH 4375, GH 4372)

  • Series.get 使用负索引器现在返回与 [] 相同的结果 (GH 4390)

  • IndexMultiIndex 处理元数据 (levels, labels, 和 names) 方式的更改 (GH 4039):

    # previously, you would have set levels or labels directly
    >>> pd.index.levels = [[1, 2, 3, 4], [1, 2, 4, 4]]
    
    # now, you use the set_levels or set_labels methods
    >>> index = pd.index.set_levels([[1, 2, 3, 4], [1, 2, 4, 4]])
    
    # similarly, for names, you can rename the object
    # but setting names is not deprecated
    >>> index = pd.index.set_names(["bob", "cranberry"])
    
    # and all methods take an inplace kwarg - but return None
    >>> pd.index.set_names(["bob", "cranberry"], inplace=True)
    
  • 所有NDFrame 对象的除法现在都是 真除法 ,无论是否导入 future 模块。这意味着对 pandas 对象的操作将默认使用 浮点 除法,并返回浮点数据类型。你可以使用 //floordiv 来进行整数除法。

    整数除法

    In [3]: arr = np.array([1, 2, 3, 4])
    
    In [4]: arr2 = np.array([5, 3, 2, 1])
    
    In [5]: arr / arr2
    Out[5]: array([0, 0, 1, 4])
    
    In [6]: pd.Series(arr) // pd.Series(arr2)
    Out[6]:
    0    0
    1    0
    2    1
    3    4
    dtype: int64
    

    真除法

    In [7]: pd.Series(arr) / pd.Series(arr2)  # no future import required
    Out[7]:
    0    0.200000
    1    0.666667
    2    1.500000
    3    4.000000
    dtype: float64
    
  • 如果在 fillna/ffill/bfill 中传递 downcast='infer',则推断并向下转换 dtype (GH 4604)

  • 对于所有 NDFrame 对象的 __nonzero__,现在将引发一个 ValueError,这恢复到 (GH 1073, GH 4633) 的行为。详见 陷阱 的更详细讨论。

    这防止了对 整个 pandas 对象进行布尔比较,这是 inherently ambiguous。这些都会引发 ValueError

    >>> df = pd.DataFrame({'A': np.random.randn(10),
    ...                    'B': np.random.randn(10),
    ...                    'C': pd.date_range('20130101', periods=10)
    ...                    })
    ...
    >>> if df:
    ...     pass
    ...
    Traceback (most recent call last):
        ...
    ValueError: The truth value of a DataFrame is ambiguous.  Use a.empty,
    a.bool(), a.item(), a.any() or a.all().
    
    >>> df1 = df
    >>> df2 = df
    >>> df1 and df2
    Traceback (most recent call last):
        ...
    ValueError: The truth value of a DataFrame is ambiguous.  Use a.empty,
    a.bool(), a.item(), a.any() or a.all().
    
    >>> d = [1, 2, 3]
    >>> s1 = pd.Series(d)
    >>> s2 = pd.Series(d)
    >>> s1 and s2
    Traceback (most recent call last):
        ...
    ValueError: The truth value of a DataFrame is ambiguous.  Use a.empty,
    a.bool(), a.item(), a.any() or a.all().
    

    NDFrame 对象中添加了 .bool() 方法,以便于评估单元素布尔序列:

    >>> pd.Series([True]).bool()
     True
    >>> pd.Series([False]).bool()
     False
    >>> pd.DataFrame([[True]]).bool()
     True
    >>> pd.DataFrame([[False]]).bool()
     False
    
  • 所有非索引 NDFrames(SeriesDataFramePanelPanel4DSparsePanel 等),现在支持全套算术运算符和算术灵活方法(add、sub、mul 等)。SparsePanel 不支持与非标量进行 powmod 运算。(GH 3765)

  • SeriesDataFrame 现在有一个 mode() 方法,用于按轴/Series计算统计众数。(GH 5367)

  • 链式赋值现在默认会在用户对副本进行赋值时发出警告。这可以通过选项 mode.chained_assignment 进行更改,允许的选项是 raise/warn/None

    In [1]: dfc = pd.DataFrame({'A': ['aaa', 'bbb', 'ccc'], 'B': [1, 2, 3]})
    
    In [2]: pd.set_option('chained_assignment', 'warn')
    

    如果尝试这样做,将显示以下警告 / 异常。

    In [3]: dfc.loc[0]['A'] = 1111
    
    Traceback (most recent call last)
       ...
    SettingWithCopyWarning:
       A value is trying to be set on a copy of a slice from a DataFrame.
       Try using .loc[row_index,col_indexer] = value instead
    

    这里是正确的赋值方法。

    In [4]: dfc.loc[0, 'A'] = 11
    
    In [5]: dfc
    Out[5]: 
         A  B
    0   11  1
    1  bbb  2
    2  ccc  3
    
  • Panel.reindex 具有以下调用签名 Panel.reindex(items=None, major_axis=None, minor_axis=None, **kwargs)

    以符合其他 NDFrame 对象。更多信息请参见 内部重构

  • Series.argminSeries.argmax 现在被别名为 Series.idxminSeries.idxmax。这些返回*索引*的

    分别返回最小或最大元素。在0.13.0之前,这些会返回最小/最大元素的位置。(GH 6214)

先前版本的弃用/更改#

这些是在 0.12 或之前宣布的更改,自 0.13.0 起生效。

  • 移除已弃用的 Factor (GH 3650)

  • 移除已弃用的 set_printoptions/reset_printoptions (GH 3046)

  • 移除已弃用的 _verbose_info (GH 3215)

  • pandas.io.parsers 中移除已弃用的 read_clipboard/to_clipboard/ExcelFile/ExcelWriter (GH 3717) 这些功能在主 pandas 命名空间中作为函数提供(例如 pd.read_clipboard

  • tupleize_cols 的默认值现在对于 to_csvread_csv 都是 False。在 0.12 版本中有公平的警告 (GH 3604)

  • display.max_seq_len 的默认值现在是 100 而不是 None。这会在各种地方激活长序列的截断显示(“…”)。(GH 3391)

弃用#

在 0.13.0 版本中已弃用

  • 已弃用 iterkv,将在未来的版本中移除(这是用于绕过 2to3 更改的 iteritems 的别名)。(GH 4384, GH 4375, GH 4372)

  • 弃用了字符串方法 match,其功能现在更习惯性地由 extract 执行。在未来的版本中,match 的默认行为将改为类似于 contains,后者返回一个布尔索引器。(它们的区别在于严格性:match 依赖于 re.matchcontains 依赖于 re.search。)在这个版本中,弃用的行为是默认的,但可以通过关键字参数 as_indexer=True 使用新行为。

索引 API 变更#

在0.13之前,使用标签索引器(.loc/.ix)来设置特定轴索引中不包含的值是不可能的。(GH 2578)。请参见 文档

Series 的情况下,这实际上是一个追加操作

In [6]: s = pd.Series([1, 2, 3])

In [7]: s
Out[7]: 
0    1
1    2
2    3
dtype: int64

In [8]: s[5] = 5.

In [9]: s
Out[9]: 
0    1.0
1    2.0
2    3.0
5    5.0
dtype: float64
In [10]: dfi = pd.DataFrame(np.arange(6).reshape(3, 2),
   ....:                    columns=['A', 'B'])
   ....: 

In [11]: dfi
Out[11]: 
   A  B
0  0  1
1  2  3
2  4  5

这之前会 KeyError

In [12]: dfi.loc[:, 'C'] = dfi.loc[:, 'A']

In [13]: dfi
Out[13]: 
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4

这类似于 append 操作。

In [14]: dfi.loc[3] = 5

In [15]: dfi
Out[15]: 
   A  B  C
0  0  1  0
1  2  3  2
2  4  5  4
3  5  5  5

在任意轴上的Panel设置操作会将输入对齐到Panel

In [20]: p = pd.Panel(np.arange(16).reshape(2, 4, 2),
   ....:              items=['Item1', 'Item2'],
   ....:              major_axis=pd.date_range('2001/1/12', periods=4),
   ....:              minor_axis=['A', 'B'], dtype='float64')
   ....:

In [21]: p
Out[21]:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 2 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2001-01-12 00:00:00 to 2001-01-15 00:00:00
Minor_axis axis: A to B

In [22]: p.loc[:, :, 'C'] = pd.Series([30, 32], index=p.items)

In [23]: p
Out[23]:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2001-01-12 00:00:00 to 2001-01-15 00:00:00
Minor_axis axis: A to C

In [24]: p.loc[:, :, 'C']
Out[24]:
            Item1  Item2
2001-01-12   30.0   32.0
2001-01-13   30.0   32.0
2001-01-14   30.0   32.0
2001-01-15   30.0   32.0

Float64Index API 更改#

  • 添加了一种新的索引类型,Float64Index。在创建索引时传递浮点值时,将自动创建此索引。这启用了一种纯标签切片范式,使得 [],ix,loc 用于标量索引和切片的工作方式完全相同。(GH 263)

    构造函数默认用于浮点类型值。

    In [16]: index = pd.Index([1.5, 2, 3, 4.5, 5])
    
    In [17]: index
    Out[17]: Index([1.5, 2.0, 3.0, 4.5, 5.0], dtype='float64')
    
    In [18]: s = pd.Series(range(5), index=index)
    
    In [19]: s
    Out[19]: 
    1.5    0
    2.0    1
    3.0    2
    4.5    3
    5.0    4
    dtype: int64
    

    对于 [],.ix,.loc 的标量选择将始终基于标签。一个整数将匹配一个相等的浮点索引(例如 3 等同于 3.0

    In [20]: s[3]
    Out[20]: 2
    
    In [21]: s.loc[3]
    Out[21]: 2
    

    唯一的定位索引是通过 iloc

    In [22]: s.iloc[3]
    Out[22]: 3
    

    未找到的标量索引将引发 KeyError

    切片总是基于索引的值,对于 [],ix,loc ,并且总是基于位置的 iloc

    In [23]: s.loc[2:4]
    Out[23]: 
    2.0    1
    3.0    2
    dtype: int64
    
    In [24]: s.iloc[2:4]
    Out[24]: 
    3.0    2
    4.5    3
    dtype: int64
    

    在浮点索引中,允许使用浮点数进行切片

    In [25]: s[2.1:4.6]
    Out[25]: 
    3.0    2
    4.5    3
    dtype: int64
    
    In [26]: s.loc[2.1:4.6]
    Out[26]: 
    3.0    2
    4.5    3
    dtype: int64
    
  • 其他索引类型的索引保持不变(以及 [],ix 的位置回退),但有一个例外,即在非 Float64Index 索引上的浮点切片现在会引发 TypeError

    In [1]: pd.Series(range(5))[3.5]
    TypeError: the label [3.5] is not a proper indexer for this index type (Int64Index)
    
    In [1]: pd.Series(range(5))[3.5:4.5]
    TypeError: the slice start [3.5] is not a proper indexer for this index type (Int64Index)
    

    使用标量浮点索引器将在未来版本中弃用,但目前仍允许使用。

    In [3]: pd.Series(range(5))[3.0]
    Out[3]: 3
    

HDFStore API 变更#

  • 查询格式更改。现在支持更像字符串的查询格式。请参见 文档

    In [27]: path = 'test.h5'
    
    In [28]: dfq = pd.DataFrame(np.random.randn(10, 4),
       ....:                    columns=list('ABCD'),
       ....:                    index=pd.date_range('20130101', periods=10))
       ....: 
    
    In [29]: dfq.to_hdf(path, key='dfq', format='table', data_columns=True)
    

    使用布尔表达式,并进行内联函数评估。

    In [30]: pd.read_hdf(path, 'dfq',
       ....:             where="index>Timestamp('20130104') & columns=['A', 'B']")
       ....: 
    Out[30]: 
                       A         B
    2013-01-05 -0.424972  0.567020
    2013-01-06 -0.673690  0.113648
    2013-01-07  0.404705  0.577046
    2013-01-08 -0.370647 -1.157892
    2013-01-09  1.075770 -0.109050
    2013-01-10  0.357021 -0.674600
    

    使用内联列引用

    In [31]: pd.read_hdf(path, 'dfq',
       ....:             where="A>0 or C>0")
       ....: 
    Out[31]: 
                       A         B         C         D
    2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
    2013-01-02  1.212112 -0.173215  0.119209 -1.044236
    2013-01-04  0.721555 -0.706771 -1.039575  0.271860
    2013-01-05 -0.424972  0.567020  0.276232 -1.087401
    2013-01-07  0.404705  0.577046 -1.715002 -1.039268
    2013-01-09  1.075770 -0.109050  1.643563 -1.469388
    2013-01-10  0.357021 -0.674600 -1.776904 -0.968914
    
  • format 关键字现在取代了 table 关键字;允许的值是 fixed(f)table(t),与之前 < 0.13.0 的默认值相同,例如 put 意味着 fixed 格式,而 append 意味着 table 格式。这个默认格式可以通过设置 io.hdf.default_format 作为一个选项来设置。

    In [32]: path = 'test.h5'
    
    In [33]: df = pd.DataFrame(np.random.randn(10, 2))
    
    In [34]: df.to_hdf(path, key='df_table', format='table')
    
    In [35]: df.to_hdf(path, key='df_table2', append=True)
    
    In [36]: df.to_hdf(path, key='df_fixed')
    
    In [37]: with pd.HDFStore(path) as store:
       ....:     print(store)
       ....: 
    <class 'pandas.io.pytables.HDFStore'>
    File path: test.h5
    
  • 显著的表格书写性能提升

  • 在表格格式中处理传递的 Series (GH 4330)

  • 现在可以在表中序列化 timedelta64[ns] 数据类型 (GH 3577),请参见 文档

  • 添加了一个 is_open 属性来指示底层文件句柄是否打开;关闭的存储现在在查看存储时会报告 ‘CLOSED’(而不是引发错误)(GH 4409)

  • 关闭 HDFStore 现在将关闭该 HDFStore 实例,但只有在所有打开句柄的引用计数(通过 PyTables)为 0 时才会关闭实际文件。本质上,您有一个由变量引用的 HDFStore 本地实例。一旦关闭它,它将报告已关闭。对同一文件的其他引用将继续操作,直到它们自己被关闭。对已关闭文件执行操作将引发 ClosedFileError

    In [38]: path = 'test.h5'
    
    In [39]: df = pd.DataFrame(np.random.randn(10, 2))
    
    In [40]: store1 = pd.HDFStore(path)
    
    In [41]: store2 = pd.HDFStore(path)
    
    In [42]: store1.append('df', df)
    
    In [43]: store2.append('df2', df)
    
    In [44]: store1
    Out[44]: 
    <class 'pandas.io.pytables.HDFStore'>
    File path: test.h5
    
    In [45]: store2
    Out[45]: 
    <class 'pandas.io.pytables.HDFStore'>
    File path: test.h5
    
    In [46]: store1.close()
    
    In [47]: store2
    Out[47]: 
    <class 'pandas.io.pytables.HDFStore'>
    File path: test.h5
    
    In [48]: store2.close()
    
    In [49]: store2
    Out[49]: 
    <class 'pandas.io.pytables.HDFStore'>
    File path: test.h5
    
  • 移除了 _quiet 属性,如果在从表中检索重复行时,请替换为 DuplicateWarning (GH 4367)

  • open 中移除了 warn 参数。相反,如果你尝试在 OPEN 文件句柄上使用 mode='w',将会引发 PossibleDataLossError 异常 (GH 4367)。

  • 允许传递一个位置数组或掩码作为 where 条件 (GH 4467)。请参见 文档 中的示例。

  • append 中添加关键字 dropna=True 以更改是否不将所有 nan 行写入存储(默认是 True,不写入所有 nan 行),也可以通过选项 io.hdf.dropna_table 进行设置 (GH 4625)

  • 传递存储创建参数;可用于支持内存中的存储

DataFrame repr 变化#

现在,DataFrame 的 HTML 和纯文本表示在表格超过一定大小后会显示截断视图,而不是切换到简短信息视图 (GH 4886, GH 5550)。这使得表示在小 DataFrame 变大时更加一致。

DataFrame 的截断 HTML 表示

要获取信息视图,请调用 DataFrame.info()。如果你更喜欢将信息视图作为大型 DataFrame 的 repr,可以通过运行 set_option('display.large_repr', 'info') 来设置。

增强功能#

  • df.to_clipboard() 学会了一个新的 excel 关键字,可以让你直接将 df 数据粘贴到 excel 中(默认启用)。 (GH 5070)。

  • read_html 现在会引发一个 URLError 而不是捕获并引发一个 ValueError (GH 4303, GH 4305)

  • read_clipboard()to_clipboard() 添加了一个测试 (GH 4282)

  • 现在,剪贴板功能可以在 PySide 中使用 (GH 4282)

  • 当绘图参数包含重叠的颜色和样式参数时,添加了更具信息性的错误消息 (GH 4402)

  • to_dict 现在接受 records 作为可能的输出类型。返回一个列键字典数组。(GH 4936)

  • NaN 在 get_dummies 中的处理 (GH 4446) 与 dummy_na

    # previously, nan was erroneously counted as 2 here
    # now it is not counted at all
    In [50]: pd.get_dummies([1, 2, np.nan])
    Out[50]: 
         1.0    2.0
    0   True  False
    1  False   True
    2  False  False
    
    # unless requested
    In [51]: pd.get_dummies([1, 2, np.nan], dummy_na=True)
    Out[51]: 
         1.0    2.0    NaN
    0   True  False  False
    1  False   True  False
    2  False  False   True
    
  • timedelta64[ns] 操作。请参见 文档

    警告

    这些操作中的大多数需要 numpy >= 1.7

    使用新的顶级 to_timedelta,你可以将标量或数组从标准的 timedelta 格式(由 to_csv 生成)转换为 timedelta 类型(np.timedelta64纳秒 为单位)。

    In [53]: pd.to_timedelta('1 days 06:05:01.00003')
    Out[53]: Timedelta('1 days 06:05:01.000030')
    
    In [54]: pd.to_timedelta('15.5us')
    Out[54]: Timedelta('0 days 00:00:00.000015500')
    
    In [55]: pd.to_timedelta(['1 days 06:05:01.00003', '15.5us', 'nan'])
    Out[55]: TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015500', NaT], dtype='timedelta64[ns]', freq=None)
    
    In [56]: pd.to_timedelta(np.arange(5), unit='s')
    Out[56]:
    TimedeltaIndex(['0 days 00:00:00', '0 days 00:00:01', '0 days 00:00:02',
                    '0 days 00:00:03', '0 days 00:00:04'],
                   dtype='timedelta64[ns]', freq=None)
    
    In [57]: pd.to_timedelta(np.arange(5), unit='d')
    Out[57]: TimedeltaIndex(['0 days', '1 days', '2 days', '3 days', '4 days'], dtype='timedelta64[ns]', freq=None)
    

    一个 dtype timedelta64[ns] 的系列现在可以被另一个 timedelta64[ns] 对象除,或者转换类型以产生一个 float64 dtype 的系列。这是频率转换。查看 文档 获取更多信息。

    In [52]: import datetime
    
    In [53]: td = pd.Series(pd.date_range('20130101', periods=4)) - pd.Series(
       ....:     pd.date_range('20121201', periods=4))
       ....: 
    
    In [54]: td[2] += np.timedelta64(datetime.timedelta(minutes=5, seconds=3))
    
    In [55]: td[3] = np.nan
    
    In [56]: td
    Out[56]: 
    0   31 days 00:00:00
    1   31 days 00:00:00
    2   31 days 00:05:03
    3                NaT
    dtype: timedelta64[ns]
    
    # to days
    In [63]: td / np.timedelta64(1, 'D')
    Out[63]:
    0    31.000000
    1    31.000000
    2    31.003507
    3          NaN
    dtype: float64
    
    In [64]: td.astype('timedelta64[D]')
    Out[64]:
    0    31.0
    1    31.0
    2    31.0
    3     NaN
    dtype: float64
    
    # to seconds
    In [65]: td / np.timedelta64(1, 's')
    Out[65]:
    0    2678400.0
    1    2678400.0
    2    2678703.0
    3          NaN
    dtype: float64
    
    In [66]: td.astype('timedelta64[s]')
    Out[66]:
    0    2678400.0
    1    2678400.0
    2    2678703.0
    3          NaN
    dtype: float64
    

    timedelta64[ns] 系列除以或乘以一个整数或整数系列

    In [57]: td * -1
    Out[57]: 
    0   -31 days +00:00:00
    1   -31 days +00:00:00
    2   -32 days +23:54:57
    3                  NaT
    dtype: timedelta64[ns]
    
    In [58]: td * pd.Series([1, 2, 3, 4])
    Out[58]: 
    0   31 days 00:00:00
    1   62 days 00:00:00
    2   93 days 00:15:09
    3                NaT
    dtype: timedelta64[ns]
    

    绝对 DateOffset 对象可以等效于 timedeltas

    In [59]: from pandas import offsets
    
    In [60]: td + offsets.Minute(5) + offsets.Milli(5)
    Out[60]: 
    0   31 days 00:05:00.005000
    1   31 days 00:05:00.005000
    2   31 days 00:10:03.005000
    3                       NaT
    dtype: timedelta64[ns]
    

    Fillna 现在支持时间增量

    In [61]: td.fillna(pd.Timedelta(0))
    Out[61]: 
    0   31 days 00:00:00
    1   31 days 00:00:00
    2   31 days 00:05:03
    3    0 days 00:00:00
    dtype: timedelta64[ns]
    
    In [62]: td.fillna(datetime.timedelta(days=1, seconds=5))
    Out[62]: 
    0   31 days 00:00:00
    1   31 days 00:00:00
    2   31 days 00:05:03
    3    1 days 00:00:05
    dtype: timedelta64[ns]
    

    你可以在 timedeltas 上进行数值缩减操作。

    In [63]: td.mean()
    Out[63]: Timedelta('31 days 00:01:41')
    
    In [64]: td.quantile(.1)
    Out[64]: Timedelta('31 days 00:00:00')
    
  • plot(kind='kde') 现在接受可选参数 bw_methodind,这些参数分别传递给 scipy.stats.gaussian_kde()(对于 scipy >= 0.11.0)以设置带宽,并传递给 gkde.evaluate() 以指定评估的索引。请参阅 scipy 文档。(GH 4298)

  • DataFrame 构造函数现在接受一个 numpy 掩码记录数组 (GH 3478)

  • 新的向量化字符串方法 extract 更方便地返回正则表达式匹配。

    In [65]: pd.Series(['a1', 'b2', 'c3']).str.extract('[ab](\\d)')
    Out[65]: 
         0
    0    1
    1    2
    2  NaN
    

    不匹配的元素返回 NaN。提取包含多个组的正则表达式会返回一个包含每组一列的 DataFrame。

    In [66]: pd.Series(['a1', 'b2', 'c3']).str.extract('([ab])(\\d)')
    Out[66]: 
         0    1
    0    a    1
    1    b    2
    2  NaN  NaN
    

    不匹配的元素会返回一行 NaN。因此,一列混乱的字符串可以 转换 成一个类似索引的 Series 或 DataFrame,其中包含清理过或更有用的字符串,而不需要使用 get() 来访问元组或 re.match 对象。

    命名组像

    In [67]: pd.Series(['a1', 'b2', 'c3']).str.extract(
       ....:     '(?P<letter>[ab])(?P<digit>\\d)')
       ....: 
    Out[67]: 
      letter digit
    0      a     1
    1      b     2
    2    NaN   NaN
    

    并且可选组也可以使用。

    In [68]: pd.Series(['a1', 'b2', '3']).str.extract(
       ....:      '(?P<letter>[ab])?(?P<digit>\\d)')
       ....: 
    Out[68]: 
      letter digit
    0      a     1
    1      b     2
    2    NaN     3
    
  • read_stata 现在接受 Stata 13 格式 (GH 4291)

  • read_fwf 现在会根据文件的前100行推断列规范,如果数据使用提供给函数的分隔符正确分隔并适当对齐列(GH 4488)。

  • 支持纳秒时间作为偏移量

    警告

    这些操作需要 numpy >= 1.7

    在秒及以下的时间范围转换已经重新设计和扩展到纳秒。现在可以使用纳秒范围的时间段。

    In [79]: pd.date_range('2013-01-01', periods=5, freq='5N')
    Out[79]:
    DatetimeIndex([          '2013-01-01 00:00:00',
                   '2013-01-01 00:00:00.000000005',
                   '2013-01-01 00:00:00.000000010',
                   '2013-01-01 00:00:00.000000015',
                   '2013-01-01 00:00:00.000000020'],
                  dtype='datetime64[ns]', freq='5N')
    

    或者以频率作为偏移量

    In [69]: pd.date_range('2013-01-01', periods=5, freq=pd.offsets.Nano(5))
    Out[69]: 
    DatetimeIndex([          '2013-01-01 00:00:00',
                   '2013-01-01 00:00:00.000000005',
                   '2013-01-01 00:00:00.000000010',
                   '2013-01-01 00:00:00.000000015',
                   '2013-01-01 00:00:00.000000020'],
                  dtype='datetime64[ns]', freq='5ns')
    

    时间戳可以在纳秒范围内进行修改

    In [70]: t = pd.Timestamp('20130101 09:01:02')
    
    In [71]: t + pd.tseries.offsets.Nano(123)
    Out[71]: Timestamp('2013-01-01 09:01:02.000000123')
    
  • 一种新方法,isin 用于 DataFrames,与布尔索引配合良好。isin 的参数,即我们要比较的 DataFrame,可以是 DataFrame、Series、dict 或值数组。更多信息请参见 文档

    要获取满足任一条件的行:

    In [72]: dfi = pd.DataFrame({'A': [1, 2, 3, 4], 'B': ['a', 'b', 'f', 'n']})
    
    In [73]: dfi
    Out[73]: 
       A  B
    0  1  a
    1  2  b
    2  3  f
    3  4  n
    
    In [74]: other = pd.DataFrame({'A': [1, 3, 3, 7], 'B': ['e', 'f', 'f', 'e']})
    
    In [75]: mask = dfi.isin(other)
    
    In [76]: mask
    Out[76]: 
           A      B
    0   True  False
    1  False  False
    2   True   True
    3  False  False
    
    In [77]: dfi[mask.any(axis=1)]
    Out[77]: 
       A  B
    0  1  a
    2  3  f
    
  • Series 现在支持 to_frame 方法,将其转换为单列 DataFrame (GH 5164)

  • 所有列在此处的 R 数据集 http://stat.ethz.ch/R-manual/R-devel/library/datasets/html/00Index.html 现在可以加载到 pandas 对象中

    # note that pandas.rpy was deprecated in v0.16.0
    import pandas.rpy.common as com
    com.load_data('Titanic')
    
  • tz_localize 可以根据未本地化数据的结构推断出秋季夏令时转换(GH 4230),参见 文档

  • DatetimeIndex 现在在 API 文档中,参见 文档

  • json_normalize() 是一个新方法,允许你从半结构化的 JSON 数据创建一个扁平表。请参阅 文档 (GH 1067)

  • 为 qtpandas 的 DataFrameModel 和 DataFrameWidget 添加了 PySide 支持。

  • Python csv 解析器现在支持 usecols (GH 4335)

  • 频率获得了几个新的偏移量:

  • DataFrame 有一个新的 interpolate 方法,类似于 Series (GH 4434, GH 1892)

    In [78]: df = pd.DataFrame({'A': [1, 2.1, np.nan, 4.7, 5.6, 6.8],
       ....:                   'B': [.25, np.nan, np.nan, 4, 12.2, 14.4]})
       ....: 
    
    In [79]: df.interpolate()
    Out[79]: 
         A      B
    0  1.0   0.25
    1  2.1   1.50
    2  3.4   2.75
    3  4.7   4.00
    4  5.6  12.20
    5  6.8  14.40
    

    此外,interpolatemethod 参数已扩展为包括 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'barycentric', 'krogh', 'piecewise_polynomial', 'pchip', 'polynomial', 'spline'。新方法需要 scipy。请查阅 Scipy 参考指南 和文档 以获取更多关于何时使用各种方法的信息。请参见 文档

    现在,插值(Interpolate)也接受一个 limit 关键字参数。这与 fillna 的 limit 类似:

    In [80]: ser = pd.Series([1, 3, np.nan, np.nan, np.nan, 11])
    
    In [81]: ser.interpolate(limit=2)
    Out[81]: 
    0     1.0
    1     3.0
    2     5.0
    3     7.0
    4     NaN
    5    11.0
    dtype: float64
    
  • 添加了 wide_to_long 面板数据便捷函数。请参见 文档

    In [82]: np.random.seed(123)
    
    In [83]: df = pd.DataFrame({"A1970" : {0 : "a", 1 : "b", 2 : "c"},
       ....:                    "A1980" : {0 : "d", 1 : "e", 2 : "f"},
       ....:                    "B1970" : {0 : 2.5, 1 : 1.2, 2 : .7},
       ....:                    "B1980" : {0 : 3.2, 1 : 1.3, 2 : .1},
       ....:                    "X"     : dict(zip(range(3), np.random.randn(3)))
       ....:                   })
       ....: 
    
    In [84]: df["id"] = df.index
    
    In [85]: df
    Out[85]: 
      A1970 A1980  B1970  B1980         X  id
    0     a     d    2.5    3.2 -1.085631   0
    1     b     e    1.2    1.3  0.997345   1
    2     c     f    0.7    0.1  0.282978   2
    
    In [86]: pd.wide_to_long(df, ["A", "B"], i="id", j="year")
    Out[86]: 
                    X  A    B
    id year                  
    0  1970 -1.085631  a  2.5
    1  1970  0.997345  b  1.2
    2  1970  0.282978  c  0.7
    0  1980 -1.085631  d  3.2
    1  1980  0.997345  e  1.3
    2  1980  0.282978  f  0.1
    
  • to_csv 现在接受一个 date_format 关键字参数,该参数指定输出日期时间对象应如何格式化。索引、列和值中遇到的日期时间都将应用此格式化。(GH 4313)

  • DataFrame.plot 将通过传递 kind='scatter' 来绘制 x 与 y 的散点图 (GH 2215)

  • 增加了对支持v2 ID的Google Analytics v3 API细分ID的支持。(GH 5271)

实验性#

  • 新的 eval() 函数在幕后使用 numexpr 实现表达式评估。这使得涉及大型 DataFrame/Series 的复杂表达式速度大幅提升。例如,

    In [87]: nrows, ncols = 20000, 100
    
    In [88]: df1, df2, df3, df4 = [pd.DataFrame(np.random.randn(nrows, ncols))
       ....:                       for _ in range(4)]
       ....: 
    
    # eval with NumExpr backend
    In [89]: %timeit pd.eval('df1 + df2 + df3 + df4')
    3.28 ms +- 425 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
    
    # pure Python evaluation
    In [90]: %timeit df1 + df2 + df3 + df4
    2.78 ms +- 161 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
    

    更多详情,请参见 文档

  • 类似于 pandas.evalDataFrame 有一个新的 DataFrame.eval 方法,该方法在 DataFrame 的上下文中评估表达式。例如,

    In [91]: df = pd.DataFrame(np.random.randn(10, 2), columns=['a', 'b'])
    
    In [92]: df.eval('a + b')
    Out[92]: 
    0   -0.685204
    1    1.589745
    2    0.325441
    3   -1.784153
    4   -0.432893
    5    0.171850
    6    1.895919
    7    3.065587
    8   -0.092759
    9    1.391365
    dtype: float64
    
  • query() 方法已被添加,允许您使用几乎与Python语法相同的自然查询语法选择 DataFrame 的元素。例如,

    In [93]: n = 20
    
    In [94]: df = pd.DataFrame(np.random.randint(n, size=(n, 3)), columns=['a', 'b', 'c'])
    
    In [95]: df.query('a < b < c')
    Out[95]: 
        a   b   c
    11  1   5   8
    15  8  16  19
    

    选择 df 中所有 a < b < c 评估为 True 的行。更多细节请参见 文档

  • pd.read_msgpack()pd.to_msgpack() 现在是一个支持序列化任意 pandas(和 python 对象)的轻量级可移植二进制格式的方法。请参阅 文档

    警告

    由于这是一个实验性库,存储格式在未来的版本之前可能不会稳定。

    df = pd.DataFrame(np.random.rand(5, 2), columns=list('AB'))
    df.to_msgpack('foo.msg')
    pd.read_msgpack('foo.msg')
    
    s = pd.Series(np.random.rand(5), index=pd.date_range('20130101', periods=5))
    pd.to_msgpack('foo.msg', df, s)
    pd.read_msgpack('foo.msg')
    

    你可以传递 iterator=True 来迭代解包的结果

    for o in pd.read_msgpack('foo.msg', iterator=True):
        print(o)
    
  • pandas.io.gbq 提供了一种简单的方法,通过 pandas DataFrames 从 Google 的 BigQuery 数据集中提取数据并加载数据。BigQuery 是一种高性能的类 SQL 数据库服务,对于对极大数据集执行临时查询非常有用。查看文档

    from pandas.io import gbq
    
    # A query to select the average monthly temperatures in the
    # in the year 2000 across the USA. The dataset,
    # publicata:samples.gsod, is available on all BigQuery accounts,
    # and is based on NOAA gsod data.
    
    query = """SELECT station_number as STATION,
    month as MONTH, AVG(mean_temp) as MEAN_TEMP
    FROM publicdata:samples.gsod
    WHERE YEAR = 2000
    GROUP BY STATION, MONTH
    ORDER BY STATION, MONTH ASC"""
    
    # Fetch the result set for this query
    
    # Your Google BigQuery Project ID
    # To find this, see your dashboard:
    # https://console.developers.google.com/iam-admin/projects?authuser=0
    projectid = 'xxxxxxxxx'
    df = gbq.read_gbq(query, project_id=projectid)
    
    # Use pandas to process and reshape the dataset
    
    df2 = df.pivot(index='STATION', columns='MONTH', values='MEAN_TEMP')
    df3 = pd.concat([df2.min(), df2.mean(), df2.max()],
                    axis=1, keys=["Min Tem", "Mean Temp", "Max Temp"])
    

    生成的 DataFrame 是:

    > df3
                Min Tem  Mean Temp    Max Temp
     MONTH
     1     -53.336667  39.827892   89.770968
     2     -49.837500  43.685219   93.437932
     3     -77.926087  48.708355   96.099998
     4     -82.892858  55.070087   97.317240
     5     -92.378261  61.428117  102.042856
     6     -77.703334  65.858888  102.900000
     7     -87.821428  68.169663  106.510714
     8     -89.431999  68.614215  105.500000
     9     -86.611112  63.436935  107.142856
     10    -78.209677  56.880838   92.103333
     11    -50.125000  48.861228   94.996428
     12    -50.332258  42.286879   94.396774
    

    警告

    要使用此模块,您需要一个 BigQuery 账户。详情请参见 <https://cloud.google.com/products/big-query>。

    截至 10/10/13,Google 的 API 中存在一个错误,阻止结果集超过 100,000 行。补丁计划在 10/14/13 那一周发布。

内部重构#

在 0.13.0 版本中,有一个主要的重构,主要是将 SeriesNDFrame 子类化,NDFrame 是目前 DataFramePanel 的基类,以统一方法和行为。Series 以前直接从 ndarray 子类化。(GH 4080, GH 3862, GH 816)

警告

从 < 0.13.0 开始有两个潜在的不兼容性

  • 使用某些 numpy 函数以前会在传递 Series 作为参数时返回一个 Series。这似乎只影响 np.ones_likenp.empty_likenp.diffnp.where。这些现在返回 ndarrays

    In [96]: s = pd.Series([1, 2, 3, 4])
    

    Numpy 用法

    In [97]: np.ones_like(s)
    Out[97]: array([1, 1, 1, 1])
    
    In [98]: np.diff(s)
    Out[98]: array([1, 1, 1])
    
    In [99]: np.where(s > 1, s, np.nan)
    Out[99]: array([nan,  2.,  3.,  4.])
    

    Pandonic 用法

    In [100]: pd.Series(1, index=s.index)
    Out[100]: 
    0    1
    1    1
    2    1
    3    1
    dtype: int64
    
    In [101]: s.diff()
    Out[101]: 
    0    NaN
    1    1.0
    2    1.0
    3    1.0
    dtype: float64
    
    In [102]: s.where(s > 1)
    Out[102]: 
    0    NaN
    1    2.0
    2    3.0
    3    4.0
    dtype: float64
    
  • 直接将 Series 传递给期望 ndarray 类型的 cython 函数将不再直接起作用,你必须传递 Series.values,请参见 增强性能

  • Series(0.5) 以前会返回标量 0.5,现在这将返回一个1元素的 Series

  • 此更改破坏了 rpy2<=2.3.8。已针对 rpy2 打开了一个问题,并且在 GH 5698 中详细介绍了变通方法。感谢 @JanSchulz。

  • 对于0.13版本之前创建的pickle,兼容性得以保留。这些必须使用 pd.read_pickle 进行解包,参见 序列化

  • 重构 series.py/frame.py/panel.py,将公共代码移动到 generic.py

    • 添加了 _setup_axes 以创建通用的 NDFrame 结构

    • 移动方法

      • from_axes,_wrap_array,axes,ix,loc,iloc,shape,empty,swapaxes,transpose,pop

      • __iter__,keys,__contains__,__len__,__neg__,__invert__

      • convert_objects,as_blocks,as_matrix,values

      • __getstate__,__setstate__ (compat 保留在 frame/panel 中)

      • __getattr__,__setattr__

      • _indexed_same,reindex_like,align,where,mask

      • fillna,replace (Series 替换现在与 DataFrame 一致)

      • filter (还增加了轴参数,以便在不同的轴上选择性过滤)

      • reindex,reindex_axis,take

      • truncate (已移动成为 NDFrame 的一部分)

  • 这些是使 PanelDataFrame 更加一致的 API 变化

    • Panel 上使用 swapaxes 并指定相同的轴现在返回一个副本

    • 支持属性访问以进行设置

    • filter 支持与原始 DataFrame filter 相同的 API

  • 没有参数调用 Reindex 现在将返回输入对象的副本

  • TimeSeries 现在是 Series 的别名。属性 is_time_series 可以用来区分(如果需要)

  • 重构 Sparse 对象以使用 BlockManager

    • 在内部创建了一种新的块类型,SparseBlock,它可以容纳多数据类型并且是不可合并的。SparseSeriesSparseDataFrame 现在从其层次结构(Series/DataFrame)继承了更多方法,不再从 SparseArray 继承(后者现在是 SparseBlock 的对象)

    • 稀疏套件现在支持与非稀疏数据的集成。非浮点稀疏数据是可支持的(部分实现)

    • 在DataFrame内的稀疏结构上的操作应保持稀疏性,合并类型的操作将转换为密集(并返回到稀疏),因此可能有些低效

    • SparseSeries 上启用 setitem 用于布尔/整数/切片

    • SparsePanels 实现保持不变(例如,不使用 BlockManager,需要工作)

  • 在 Series/DataFrame 中添加了 ftypes 方法,类似于 dtypes,但指示底层是稀疏/密集的(以及数据类型)

  • 所有 NDFrame 对象现在可以使用 __finalize__() 来指定从现有对象传播到新对象的各种值(例如,Series 中的 name 现在将更自动地跟随)

  • 内部类型检查现在通过一组生成的类完成,允许 isinstance(value, klass) 而无需直接导入 klass,感谢 @jtratner

  • 在系列更新中的错误,其中父框架没有根据更改 (GH 4080) 或类型 (GH 3217) 更新其缓存,fillna (GH 3386)

  • 使用 dtype 转换进行索引修复 (GH 4463, GH 4204)

  • 重构 Series.reindex 到 core/generic.py (GH 4604, GH 4618),允许在 Series 上重新索引时使用 method=

  • Series.copy 不再接受 order 参数,现在与 NDFrame 复制一致。

  • 重构 rename 方法到 core/generic.py;修复了 (GH 4605) 的 Series.rename,并为 Panel 添加了具有相同签名的 rename

  • 重构 clip 方法到 core/generic.py (GH 4798)

  • _get_numeric_data/_get_bool_data 重构到 core/generic.py,允许 Series/Panel 功能

  • ``Series``(用于索引)/ ``Panel``(用于项目)现在允许通过属性访问其元素(GH 1903

    In [103]: s = pd.Series([1, 2, 3], index=list('abc'))
    
    In [104]: s.b
    Out[104]: 2
    
    In [105]: s.a = 5
    
    In [106]: s
    Out[106]: 
    a    5
    b    2
    c    3
    dtype: int64
    

错误修复#

  • HDFStore

    • 在附加不同块顺序时引发无效的 TypeError 而不是 ValueError (GH 4096)

    • read_hdf 没有正确处理传递的 mode (GH 4504)

    • 附加一个长度为0的表将正确工作 (GH 4273)

    • to_hdf 在同时传递 appendtable 参数时会引发错误 (GH 4584)

    • 从具有跨 dtypes 重复列的存储中读取会引发 (GH 4767)

    • 修复了一个错误,当列名不是字符串时,ValueError 没有正确抛出 (GH 4956)

    • 以固定格式编写的零长度序列未能正确反序列化。(GH 4708)

    • 修复了 pyt3 上的解码性能问题 (GH 5441)

    • 在存储之前验证 MultiIndex 中的级别 (GH 5527)

    • 正确处理带有 Panel 的 data_columns (GH 5717)

  • 修复了 tslib.tz_convert(vals, tz1, tz2) 中的错误:在尝试访问 trans[pos + 1] 时可能会引发 IndexError 异常 (GH 4496)

  • by 参数现在在 *.hist 绘图方法中与 layout 参数正确工作(GH 4102, GH 4014

  • 修复了 PeriodIndex.map 中的一个错误,其中使用 str 会返回索引的字符串表示形式 (GH 4136)

  • 在使用自定义 matplotlib 默认颜色时修复了 test_time_series_plot_color_with_empty_kwargs 测试失败 (GH 4345)

  • 修复 stata IO 测试的运行。现在使用临时文件进行写入 (GH 4353)

  • 修复了一个问题,即对于整数值的帧,DataFrame.sumDataFrame.mean 慢 (GH 4365)

  • read_html 测试现在可以在 Python 2.6 上工作 (GH 4351)

  • 修复了 network 测试抛出 NameError 的错误,因为局部变量未定义 (GH 4381)

  • to_json 中,如果传递的 orient 会导致由于重复索引而丢失数据,则引发异常 (GH 4359)

  • to_json 中,修复日期处理,使毫秒成为默认的时间戳,如文档字符串所述 (GH 4362)。

  • as_index 在进行 groupby apply 时不再被忽略 (GH 4648, GH 3417)

  • JSON NaT 处理已修复,NaT 现在序列化为 null (GH 4498)

  • 在JSON对象键中固定可转义字符的处理 (GH 4593)

  • 修复了当 na_values=None 时传递 keep_default_na=False 的问题 (GH 4318)

  • 修复了在具有重复列和混合数据类型的 DataFrame 上 values 引发错误的问题,问题出现在 (GH 4377)

  • orient='split' 时,修复了 read_json 中重复列和类型转换的错误 (GH 4377)

  • 修复了 JSON 错误,当使用除 ‘.’ 以外的十进制分隔符的区域设置在编码/解码某些值时会抛出异常。(GH 4918)

  • 修复 .iat 使用 PeriodIndex 的索引 (GH 4390)

  • 修复了一个问题,即 PeriodIndex 与自身连接时返回的是新实例而不是同一个实例 (GH 4379);还为其他索引类型添加了对此的测试

  • 在使用带有 usecols 参数的 CSV cparser 时,修复了所有 dtypes 都被转换为对象的错误 (GH 3192)

  • 修复了在合并块时,结果的 DataFrame 部分设置 _ref_locs 的问题 (GH 4403)

  • 修复了一个问题,即当使用顶级 matplotlib API 调用时,hist 子图被覆盖的问题 (GH 4408)

  • 修复了一个调用 Series.astype(str) 会截断字符串的错误 (GH 4405, GH 4437)

  • 修复了一个py3兼容性问题,其中字节被表示为元组 (GH 4455)

  • 如果项目命名为 ‘a’,修复固定面板属性命名冲突 (GH 3440)

  • 修复了一个在绘图时重复索引引发的问题 (GH 4486)

  • 修复了一个问题,即 cumsum 和 cumprod 在 bool 类型下无法工作 (GH 4170, GH 4440)

  • 修复了在 xs 中返回不正确变暗对象的面板切片问题 (GH 4016)

  • 修复重采样错误,当只有一个组时,不使用自定义的reduce函数 (GH 3849, GH 4494)

  • 带有转置框架的固定面板分配 (GH 3830)

  • 使用 Panel 和作为需要对齐的值的 Panel 进行集合索引时引发 (GH 3777)

  • frozenset 对象现在在 Series 构造函数中引发 (GH 4482, GH 4480)

  • 修复了对具有多个数据类型的重复 MultiIndex 进行排序的问题 (GH 4516)

  • 修复了 DataFrame.set_values 中的一个错误,该错误在扩展索引时导致名称属性丢失。(GH 3742, GH 4039)

  • 修复了在 MultiIndex 上设置单个 nameslevelslabels 时未进行验证的问题 (GH 3714, GH 4039)

  • 在 pivot_table 中修复 (GH 3334)。如果值是索引,则边距不会计算。

  • 修复在操作日期时间时,右侧为 np.timedelta64np.offsets.DateOffset 的错误 (GH 4532)

  • 修复了 series/datetimeindex 与 np.timedelta64 的算术运算不一致的问题 (GH 4134) 和 NumPy 1.6 中的 timedelta 错误 (GH 4135)

  • 在Windows上使用PY3时修复 pd.read_clipboard 中的错误 (GH 4561);未正确解码

  • tslib.get_period_field()tslib.get_period_field_arr() 现在如果代码参数超出范围则引发 (GH 4519, GH 4520)

  • 修复在空系列上的布尔索引丢失索引名称的问题 (GH 4235),infer_dtype 可以处理空数组。

  • 修复多轴重新索引;如果轴匹配没有替换当前轴,可能会导致潜在的惰性频率推断问题 (GH 3317)

  • 修复了 DataFrame.apply 错误地重新引发异常的问题(导致原始堆栈跟踪被截断)。

  • 使用 ix/loc 和非唯一选择器修复选择 (GH 4619)

  • 修复在使用 iloc/loc 进行赋值时涉及现有列的 dtype 更改的问题 (GH 4312, GH 5702) 在 core/indexing 中使用 Block.setitem 的内部 setitem_with_indexer

  • 修复了 csv_import 中浮点数的千位运算符未正确处理的问题 (GH 4322)

  • 修复了 CacheableOffset 未被许多 DateOffset 正确使用的问题;这阻止了 DateOffset 被缓存 (GH 4609)

  • 修复在左侧为 DataFrame,右侧为列表/元组时的布尔比较 (GH 4576)

  • 修复在 Series/DataFrame 上使用 setitem 设置 None 时的错误/数据类型转换问题 (GH 4667)

  • pd.read_stata 中基于传入的非默认编码修复解码 (GH 4626)

  • 修复 DataFrame.from_records 使用普通的 ndarray。 (GH 4727)

  • 修复了 Index.renameMultiIndex.rename 等的一些不一致性。(GH 4718, GH 4628)

  • 在使用 iloc/loc 时遇到横截面和重复索引的错误 (GH 4726)

  • 使用 QUOTE_NONEto_csv 导致 Exception 的 Bug。(GH 4328)

  • 当右侧长度不正确时,Series 索引未引发错误的 Bug (GH 2702)

  • 在多索引中使用部分字符串选择作为多索引的一部分时出现的错误 (GH 4758)

  • 在非唯一索引的索引上重新索引时,现在会引发 ValueError (GH 4746)

  • loc/ix 设置中使用 MultiIndex 轴和 NumPy 数组的单个索引器时出现的错误,相关于 (GH 3777)

  • 在跨 dtypes 的重复列进行连接时存在错误,axis=0 未合并 (GH 4771, GH 4975)

  • iloc 中使用切片索引失败的错误 (GH 4771)

  • read_fwf 中没有 colspecs 或 width 的错误信息不正确。(GH 4774)

  • 修复在具有重复索引的序列中索引的错误 (GH 4548, GH 4550)

  • 修复了在 Python 3 中使用 read_fwf 读取压缩文件的错误。(GH 3963)

  • 修复了一个带有重复索引和dtype更改的分配问题 (GH 4686)

  • 在Python 3中修复了将压缩文件读取为``bytes``而不是``str``的错误。简化了Python 3中的字节生成文件处理(GH 3963, GH 4785)。

  • 修复了在不同版本的 matplotlib 中与对数刻度条形图的刻度位置/刻度标签相关的问题 (GH 4789)

  • 与 repr() 发出的内部调用相关的被抑制的 DeprecationWarning (GH 4391)

  • 修复了使用 .loc 时重复索引和重复选择器的问题 (GH 4825)

  • 修复了 DataFrame.sort_index 的一个问题,当按单列排序并传递 ascending 的列表时,ascending 的参数被解释为 True (GH 4839, GH 4846)

  • 修复了 Panel.tshift 不工作的问题。为 Panel.shift 添加了 freq 支持 (GH 4853)

  • 修复了使用Python引擎(即PythonParser)时TextFileReader中的一个问题,当thousands != “,”时(GH 4596

  • 在使用 where 时,getitem 中存在重复索引的错误 (GH 4879)

  • 修复类型推断代码将浮点列强制转换为日期时间 (GH 4601)

  • 修复的 _ensure_numeric 不检查复数 (GH 4902)

  • 修复了 Series.hist 中的一个错误,当传递 by 参数时会创建两个图形 (GH 4112, GH 4113)。

  • 修复了 convert_objects 中对于 > 2 维度的错误 (GH 4937)

  • 修复了 DataFrame/Panel 缓存插入和后续索引中的一个错误 (GH 4939, GH 5424)

  • FrozenNDArrayFrozenList 的固定字符串方法 (GH 4929)

  • 修复了在索引扩增场景中设置无效或超出范围值的错误 (GH 4940)

  • 对空 Series 进行 fillna 的测试 (GH 4346),感谢 @immerrr

  • 修复了 copy() 以浅拷贝轴/索引,从而保持单独的元数据。(GH 4202, GH 4830)

  • 在Python解析器中修复了read_csv的skiprows选项 (GH 4382)

  • 修复了阻止 cut 在未显式传递标签的情况下与 np.inf 级别一起工作的错误 (GH 3415)

  • 修复了 DatetimeIndex.union 中重叠检查的错误 (GH 4564)

  • 在csv_parser中修复了千位分隔符和日期解析器之间的冲突 (GH 4678)

  • 修复当dtypes不同时的追加问题(错误显示混合float/np.datetime64) (GH 4993)

  • 修复 DateOffset 的 repr。不再在 kwds 中显示重复条目。移除未使用的偏移字段。(GH 4638)

  • 如果在使用 usecols 时读取 csv 文件时固定了错误的索引名称。仅适用于 c 解析器。(GH 4201)

  • Timestamp 对象现在可以出现在与 SeriesDataFrame 对象的比较操作的左侧 (GH 4982)。

  • 通过 iloc/loc 使用 np.nan 进行索引时修复了一个错误 (GH 5016)

  • 修复了一个低内存c解析器在同一文件的不同块中可能创建不同类型的问题。现在强制转换为数值类型或引发警告。(GH 3866)

  • 修复了一个重塑 Series 到其自身形状时引发 TypeError 的错误 (GH 4554) 以及其他重塑问题。

  • ix/loc 和混合 int/string 索引设置中的错误 (GH 4544)

  • 确保系列-系列布尔比较是基于标签的 (GH 4947)

  • 使用时间戳部分索引器进行多级索引中的错误 (GH 4294)

  • 测试/修复所有-nan帧的MultiIndex构造 (GH 4078)

  • 修复了一个错误,其中 read_html() 未能正确推断包含逗号的表格的值 (GH 5029)

  • 修复了一个错误,其中 read_html() 没有提供返回表的稳定排序 (GH 4770, GH 5029)。

  • 修复了一个错误,当传递 index_col=0 时,read_html() 解析不正确 (GH 5066)。

  • 修复了一个错误,其中 read_html() 错误地推断了头部的类型 (GH 5048)。

  • 修复了一个 DatetimeIndexPeriodIndex 连接导致堆栈溢出的错误 (GH 3899)。

  • 修复了一个 groupby 对象不允许绘图的错误 (GH 5102)。

  • 修复了一个 groupby 对象无法自动补全列名的错误 (GH 5102)。

  • 修复了一个 groupby.plot() 及其相关函数多次重复绘制图形的错误 (GH 5102)。

  • 在 fillna 时提供 object dtypes 的自动转换,相关 (GH 5103)

  • 修复了一个在选项解析器清理中默认选项被覆盖的错误 (GH 5121)。

  • 对于 iloc 索引,将列表/ndarray 同样对待,使用类似列表的 (GH 5006)

  • 修复 MultiIndex.get_level_values() 缺失值的问题 (GH 5074)

  • 修复带有 datetime64 输入的 Timestamp() 的边界检查 (GH 4065)

  • 修复了一个 TestReadHtml 没有调用正确的 read_html() 函数的错误 (GH 5150)。

  • 修复了 NDFrame.replace() 的一个错误,该错误使得替换看起来像是(错误地)使用了正则表达式 (GH 5143)。

  • 修复 to_datetime 的更好错误信息 (GH 4928)

  • 确保在 travis-ci 上测试不同的区域设置(GH 4918)。还添加了一些用于获取区域设置和使用上下文管理器设置区域设置的实用程序。

  • 修复了 isnull(MultiIndex) 上的段错误(现在改为引发错误) (GH 5123, GH 5125)

  • 在执行对齐操作时允许重复索引 (GH 5185, GH 5639)

  • 构造函数中的复合数据类型会引发 NotImplementedError (GH 5191)

  • 比较重复帧中的错误 (GH 4421) 相关

  • 在重复帧中描述的错误

  • to_datetime 在指定格式和 coerce=True 时未引发错误 (GH 5195)

  • 在多个索引器和需要广播的Series的rhs设置中存在``loc``错误 (GH 5206)

  • 修复了在 MultiIndex 上就地设置级别或标签时不会清除缓存的 values 属性,因此返回错误的 values 的错误。(GH 5215)

  • 修复了过滤分组的 DataFrame 或 Series 时未保持原始顺序的错误 (GH 4621)。

  • 固定的 Period 与一个业务日期频率,如果在非业务日期,则始终向前滚动。(GH 5203)

  • 修复了 Excel 写入器中的一个错误,其中包含重复列名的框架未正确写入。(GH 5235)

  • 修复了 drop 和 Series 上非唯一索引的问题 (GH 5248)

  • 修复了C解析器中由于传递的名称多于文件中的列数导致的固定段错误。(GH 5156)

  • 修复 Series.isin 与日期/时间类似的数据类型 (GH 5021)

  • C 和 Python 解析器现在可以处理更常见的 MultiIndex 列格式,该格式没有索引名称的行 (GH 4702)

  • 尝试使用超出范围的日期作为对象数据类型时出现的错误 (GH 5312)

  • 尝试显示嵌入的 PandasObject 时出现的错误 (GH 5324)

  • 允许操作时间戳以在结果超出边界时返回日期时间(GH 5312

  • 修复 initObjToJSON() 的返回值/类型签名,使其与 numpy 的 import_array() 兼容(GH 5334, GH 5326

  • 在重命名后对 DataFrame 设置索引时出现错误 (GH 5344)

  • 测试套件在测试图形时不再留下临时文件。(GH 5347) (感谢发现这个问题 @yarikoptic!)

  • 在 win32 上修复了 html 测试。(GH 4580)

  • 确保 head/tail 是基于 iloc 的,(GH 5370)

  • 修复了 PeriodIndex 字符串表示中存在1个或2个元素时的错误。(GH 5372)

  • GroupBy 方法 transformfilter 可以用于具有重复(非唯一)索引的 Series 和 DataFrames。(GH 4620)

  • 修复在 repr 中不打印空系列名称的问题 (GH 4651)

  • 默认情况下,使测试在临时目录中创建临时文件。(GH 5419)

  • pd.to_timedelta 对标量返回一个标量 (GH 5410)

  • pd.to_timedelta 接受 NaNNaT,返回 NaT 而不是引发 (GH 5437)

  • 在较大的 pandas 对象上 isnull 的性能改进

  • 修复了与一维 ndarray 相关的各种 setitem,这些 ndarray 的长度与索引器不匹配 (GH 5508)

  • 使用 MultiIndex 和 iloc 时的 getitem 错误 (GH 5528)

  • 在 Series 上的 delitem 中的 Bug (GH 5542)

  • 在使用自定义函数且对象未被改变时的修复 (GH 5545)

  • 在使用 loc 从非唯一索引中选择时的错误 (GH 5553)

  • 当用户函数返回 None 时,groupby 返回不一致类型的错误,(GH 5592)

  • 解决 numpy 1.7.0 中的回归问题,该问题错误地从 ndarray.item 引发 IndexError (GH 5666)

  • 对象重复索引中的错误,导致索引不唯一 (GH 5678)

  • 使用 Series 和传递的 series/dict 时 fillna 中的 Bug (GH 5703)

  • 使用类似日期时间的分组器进行groupby转换时的错误 (GH 5712)

  • 在PY3中使用某些键时,MultiIndex选择中的错误 (GH 5725)

  • 在某些情况下,不同数据类型的按行拼接失败 (GH 5754)

贡献者#

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

  • Agustín Herranz +

  • Alex Gaudio +

  • Alex Rothberg +

  • Andreas Klostermann +

  • Andreas Würl +

  • Andy Hayden

  • Ben Alex +

  • Benedikt Sauer +

  • Brad Buran

  • Caleb Epstein +

  • Chang She

  • Christopher Whelan

  • DSM +

  • Dale Jung +

  • Dan Birken

  • David Rasch +

  • Dieter Vandenbussche

  • Gabi Davar +

  • Garrett Drapala

  • Goyo +

  • Greg Reda +

  • Ivan Smirnov +

  • Jack Kelly +

  • Jacob Schaer +

  • Jan Schulz +

  • Jeff Tratner

  • Jeffrey Tratner

  • John McNamara +

  • John W. O’Brien +

  • Joris Van den Bossche

  • Justin Bozonier +

  • Kelsey Jordahl

  • Kevin Stone

  • Kieran O’Mahony

  • Kyle Hausmann +

  • Kyle Kelley +

  • Kyle Meyer

  • Mike Kelly

  • Mortada Mehyar +

  • Nick Foti +

  • Olivier Harris +

  • Ondřej Čertík +

  • PKEuS

  • Phillip Cloud

  • Pierre Haessig +

  • Richard T. Guy +

  • Roman Pekar +

  • Roy Hyunjin Han

  • Skipper Seabold

  • Sten +

  • Thomas A Caswell +

  • Thomas Kluyver

  • Tiago Requeijo +

  • TomAugspurger

  • Trent Hauck

  • Valentin Haenel +

  • Viktor Kerkez +

  • Vincent Arel-Bundock

  • Wes McKinney

  • Wes Turner +

  • Weston Renoud +

  • Yaroslav Halchenko

  • Zach Dwiel +

  • chapman siu +

  • chappers +

  • d10genes +

  • danielballan

  • daydreamt +

  • engstrom +

  • jreback

  • monicaBee +

  • prossahl +

  • rockg +

  • unutbu +

  • westurner +

  • y-p

  • zach powers