版本 0.13.1(2014 年 2 月 3 日)#

这是 0.13.0 的次要版本,包括少量 API 更改、一些新功能、增强功能和性能改进以及大量错误修复。我们建议所有用户升级到此版本。

亮点包括:

  • 添加了infer_datetime_format关键字 toread_csv/to_datetime以允许加速同质格式的日期时间。

  • 将智能地限制日期时间/时间增量格式的显示精度。

  • 增强面板apply()方法。

  • 新教程部分中的建议教程。

  • 我们的 pandas 生态系统正在不断发展,我们现在在新的生态系统页面部分中展示相关项目。

  • 为了改进文档,我们做了很多工作,并且添加了一个新的贡献部分。

  • 尽管它可能只有开发人员感兴趣,但我们 <3 我们的新 CI 状态页面:ScatterCI

警告

0.13.1 修复了由于 numpy < 1.8 和在类似字符串的数组上进行链式赋值而导致的错误。请查看文档,链式索引可能会产生意想不到的结果,通常应该避免。

以前这会出现段错误:

df = pd.DataFrame({"A": np.array(["foo", "bar", "bah", "foo", "bar"])})
df["A"].iloc[0] = np.nan

执行此类作业的推荐方法是:

In [1]: df = pd.DataFrame({"A": np.array(["foo", "bar", "bah", "foo", "bar"])})

In [2]: df.loc[0, "A"] = np.nan

In [3]: df
Out[3]: 
     A
0  NaN
1  bar
2  bah
3  foo
4  bar

输出格式增强#

  • df.info() 视图现在显示每列的 dtype 信息 ( GH 5682 )

  • df.info() 现在支持该选项max_info_rows,禁用大帧的空计数(GH 5974

    In [4]: max_info_rows = pd.get_option("max_info_rows")
    
    In [5]: df = pd.DataFrame(
       ...:     {
       ...:         "A": np.random.randn(10),
       ...:         "B": np.random.randn(10),
       ...:         "C": pd.date_range("20130101", periods=10),
       ...:     }
       ...: )
       ...: 
    
    In [6]: df.iloc[3:6, [0, 2]] = np.nan
    
    # set to not display the null counts
    In [7]: pd.set_option("max_info_rows", 0)
    
    In [8]: df.info()
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 10 entries, 0 to 9
    Data columns (total 3 columns):
     #   Column  Dtype         
    ---  ------  -----         
     0   A       float64       
     1   B       float64       
     2   C       datetime64[ns]
    dtypes: datetime64[ns](1), float64(2)
    memory usage: 368.0 bytes
    
    # this is the default (same as in 0.13.0)
    In [9]: pd.set_option("max_info_rows", max_info_rows)
    
    In [10]: df.info()
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 10 entries, 0 to 9
    Data columns (total 3 columns):
     #   Column  Non-Null Count  Dtype         
    ---  ------  --------------  -----         
     0   A       7 non-null      float64       
     1   B       10 non-null     float64       
     2   C       7 non-null      datetime64[ns]
    dtypes: datetime64[ns](1), float64(2)
    memory usage: 368.0 bytes
    
  • 为新的 DataFrame repr添加show_dimensions显示选项以控制是否打印尺寸。

    In [11]: df = pd.DataFrame([[1, 2], [3, 4]])
    
    In [12]: pd.set_option("show_dimensions", False)
    
    In [13]: df
    Out[13]: 
       0  1
    0  1  2
    1  3  4
    
    In [14]: pd.set_option("show_dimensions", True)
    
    In [15]: df
    Out[15]: 
       0  1
    0  1  2
    1  3  4
    
    [2 rows x 2 columns]
    
  • forArrayFormatterdatetimenowtimedelta64根据数组中的值智能限制精度 ( GH 3401 )

    以前的输出可能如下所示:

      age                 today               diff
    0 2001-01-01 00:00:00 2013-04-19 00:00:00 4491 days, 00:00:00
    1 2004-06-01 00:00:00 2013-04-19 00:00:00 3244 days, 00:00:00
    

    现在输出看起来像:

    In [16]: df = pd.DataFrame(
       ....:     [pd.Timestamp("20010101"), pd.Timestamp("20040601")], columns=["age"]
       ....: )
       ....: 
    
    In [17]: df["today"] = pd.Timestamp("20130419")
    
    In [18]: df["diff"] = df["today"] - df["age"]
    
    In [19]: df
    Out[19]: 
             age      today      diff
    0 2001-01-01 2013-04-19 4491 days
    1 2004-06-01 2013-04-19 3244 days
    
    [2 rows x 3 columns]
    

API 更改#

  • -NaN和添加-nan到默认的 NA 值集 ( GH 5952 )。请参阅NA 值

  • 添加了Series.str.get_dummies矢量化字符串方法(GH 6021),以提取分隔字符串列的虚拟/指示符变量:

    In [20]: s = pd.Series(["a", "a|b", np.nan, "a|c"])
    
    In [21]: s.str.get_dummies(sep="|")
    Out[21]: 
       a  b  c
    0  1  0  0
    1  1  1  0
    2  0  0  0
    3  1  0  1
    
    [4 rows x 3 columns]
    
  • 添加了NDFrame.equals()比较两个 NDFrame 是否相等且具有相同轴、数据类型和值的方法。添加了 array_equivalent比较两个 ndarray 是否相等的函数。相同位置的 NaN 被视为相等。 ( GH 5283 ) 另请参阅文档以获取激励示例。

    df = pd.DataFrame({"col": ["foo", 0, np.nan]})
    df2 = pd.DataFrame({"col": [np.nan, 0, "foo"]}, index=[2, 1, 0])
    df.equals(df2)
    df.equals(df2.sort_index())
    
  • DataFrame.apply将使用reduce参数来确定 当 为空时是否应返回aSeries或 a ( GH 6007 )。DataFrameDataFrame

    以前,如果没有列,则调用DataFrame.applyDataFrame将返回 a,或者使用空调用正在应用的函数来猜测是否 应返回a或:DataFrameSeriesSeriesDataFrame

    In [32]: def applied_func(col):
      ....:    print("Apply function being called with: ", col)
      ....:    return col.sum()
      ....:
    
    In [33]: empty = DataFrame(columns=['a', 'b'])
    
    In [34]: empty.apply(applied_func)
    Apply function being called with:  Series([], Length: 0, dtype: float64)
    Out[34]:
    a   NaN
    b   NaN
    Length: 2, dtype: float64
    

    现在,当apply在空上调用时DataFrame:如果reduce 参数是TrueaSeries将返回,如果是Falsea DataFrame将返回,如果是None(默认),则将使用空系列调用正在应用的函数以尝试猜测返回类型。

    In [35]: empty.apply(applied_func, reduce=True)
    Out[35]:
    a   NaN
    b   NaN
    Length: 2, dtype: float64
    
    In [36]: empty.apply(applied_func, reduce=False)
    Out[36]:
    Empty DataFrame
    Columns: [a, b]
    Index: []
    
    [0 rows x 2 columns]
    

先前版本弃用/更改#

0.13 或之前的版本中没有宣布的更改将于 0.13.1 生效

弃用#

0.13.1 中没有弃用先前的行为

增强功能#

  • pd.read_csvpd.to_datetime学习了一个新的infer_datetime_format关键字,它在许多情况下极大地提高了解析性能。感谢@lexual 的建议和@danbirken 的快速实施。 (GH 5490GH 6021

    如果parse_dates启用并设置了此标志,pandas 将尝试推断列中日期时间字符串的格式,如果可以推断,则切换到更快的解析方法。在某些情况下,这可以将解析速度提高约 5-10 倍。

    # Try to infer the format for the index column
    df = pd.read_csv(
        "foo.csv", index_col=0, parse_dates=True, infer_datetime_format=True
    )
    
  • date_formatdatetime_format现在可以在写入文件时指定关键字(excel GH 4133

  • MultiIndex.from_product用于根据一组可迭代对象的笛卡尔积创建 MultiIndex 的便捷函数 ( GH 6055 ):

    In [22]: shades = ["light", "dark"]
    
    In [23]: colors = ["red", "green", "blue"]
    
    In [24]: pd.MultiIndex.from_product([shades, colors], names=["shade", "color"])
    Out[24]: 
    MultiIndex([('light',   'red'),
                ('light', 'green'),
                ('light',  'blue'),
                ( 'dark',   'red'),
                ( 'dark', 'green'),
                ( 'dark',  'blue')],
               names=['shade', 'color'])
    
  • 小组apply()将在非 ufunc 上工作。请参阅文档

    In [28]: import pandas._testing as tm
    
    In [29]: panel = tm.makePanel(5)
    
    In [30]: panel
    Out[30]:
    <class 'pandas.core.panel.Panel'>
    Dimensions: 3 (items) x 5 (major_axis) x 4 (minor_axis)
    Items axis: ItemA to ItemC
    Major_axis axis: 2000-01-03 00:00:00 to 2000-01-07 00:00:00
    Minor_axis axis: A to D
    
    In [31]: panel['ItemA']
    Out[31]:
                       A         B         C         D
    2000-01-03 -0.673690  0.577046 -1.344312 -1.469388
    2000-01-04  0.113648 -1.715002  0.844885  0.357021
    2000-01-05 -1.478427 -1.039268  1.075770 -0.674600
    2000-01-06  0.524988 -0.370647 -0.109050 -1.776904
    2000-01-07  0.404705 -1.157892  1.643563 -0.968914
    
    [5 rows x 4 columns]
    

    指定apply对 Series 进行操作的 an (返回单个元素)

    In [32]: panel.apply(lambda x: x.dtype, axis='items')
    Out[32]:
                      A        B        C        D
    2000-01-03  float64  float64  float64  float64
    2000-01-04  float64  float64  float64  float64
    2000-01-05  float64  float64  float64  float64
    2000-01-06  float64  float64  float64  float64
    2000-01-07  float64  float64  float64  float64
    
    [5 rows x 4 columns]
    

    类似的归约类型操作

    In [33]: panel.apply(lambda x: x.sum(), axis='major_axis')
    Out[33]:
          ItemA     ItemB     ItemC
    A -1.108775 -1.090118 -2.984435
    B -3.705764  0.409204  1.866240
    C  2.110856  2.960500 -0.974967
    D -4.532785  0.303202 -3.685193
    
    [4 rows x 3 columns]
    

    这相当于

    In [34]: panel.sum('major_axis')
    Out[34]:
          ItemA     ItemB     ItemC
    A -1.108775 -1.090118 -2.984435
    B -3.705764  0.409204  1.866240
    C  2.110856  2.960500 -0.974967
    D -4.532785  0.303202 -3.685193
    
    [4 rows x 3 columns]
    

    返回面板的转换操作,但正在计算major_axis上的z分数

    In [35]: result = panel.apply(lambda x: (x - x.mean()) / x.std(),
      ....:                      axis='major_axis')
      ....:
    
    In [36]: result
    Out[36]:
    <class 'pandas.core.panel.Panel'>
    Dimensions: 3 (items) x 5 (major_axis) x 4 (minor_axis)
    Items axis: ItemA to ItemC
    Major_axis axis: 2000-01-03 00:00:00 to 2000-01-07 00:00:00
    Minor_axis axis: A to D
    
    In [37]: result['ItemA']                           # noqa E999
    Out[37]:
                      A         B         C         D
    2000-01-03 -0.535778  1.500802 -1.506416 -0.681456
    2000-01-04  0.397628 -1.108752  0.360481  1.529895
    2000-01-05 -1.489811 -0.339412  0.557374  0.280845
    2000-01-06  0.885279  0.421830 -0.453013 -1.053785
    2000-01-07  0.742682 -0.474468  1.041575 -0.075499
    
    [5 rows x 4 columns]
    
  • apply()在横截面上操作的面板。 (GH 1148

    In [38]: def f(x):
       ....:     return ((x.T - x.mean(1)) / x.std(1)).T
       ....:
    
    In [39]: result = panel.apply(f, axis=['items', 'major_axis'])
    
    In [40]: result
    Out[40]:
    <class 'pandas.core.panel.Panel'>
    Dimensions: 4 (items) x 5 (major_axis) x 3 (minor_axis)
    Items axis: A to D
    Major_axis axis: 2000-01-03 00:00:00 to 2000-01-07 00:00:00
    Minor_axis axis: ItemA to ItemC
    
    In [41]: result.loc[:, :, 'ItemA']
    Out[41]:
                       A         B         C         D
    2000-01-03  0.012922 -0.030874 -0.629546 -0.757034
    2000-01-04  0.392053 -1.071665  0.163228  0.548188
    2000-01-05 -1.093650 -0.640898  0.385734 -1.154310
    2000-01-06  1.005446 -1.154593 -0.595615 -0.809185
    2000-01-07  0.783051 -0.198053  0.919339 -1.052721
    
    [5 rows x 4 columns]
    

    这相当于下面的

    In [42]: result = pd.Panel({ax: f(panel.loc[:, :, ax]) for ax in panel.minor_axis})
    
    In [43]: result
    Out[43]:
    <class 'pandas.core.panel.Panel'>
    Dimensions: 4 (items) x 5 (major_axis) x 3 (minor_axis)
    Items axis: A to D
    Major_axis axis: 2000-01-03 00:00:00 to 2000-01-07 00:00:00
    Minor_axis axis: ItemA to ItemC
    
    In [44]: result.loc[:, :, 'ItemA']
    Out[44]:
                       A         B         C         D
    2000-01-03  0.012922 -0.030874 -0.629546 -0.757034
    2000-01-04  0.392053 -1.071665  0.163228  0.548188
    2000-01-05 -1.093650 -0.640898  0.385734 -1.154310
    2000-01-06  1.005446 -1.154593 -0.595615 -0.809185
    2000-01-07  0.783051 -0.198053  0.919339 -1.052721
    
    [5 rows x 4 columns]
    

表现

0.13.1 的性能改进

  • 系列 datetime/timedelta 二进制运算 ( GH 5801 )

  • 数据框count/dropna用于axis=1

  • Series.str.contains 现在有一个regex=False关键字,对于普通(非正则表达式)字符串模式可以更快。 (GH 5879

  • 系列.str.提取物(GH 5944

  • dtypes/ftypes方法(GH 5968

  • 使用对象数据类型进行索引(GH 5968

  • DataFrame.applyGH 6013

  • JSON IO 中的回归(GH 5765

  • 系列索引构建 ( GH 6150 )

实验#

0.13.1 中没有实验性变化

Bug修复

  • io.wb.get_countries不包括所有国家/地区的错误( GH 6008

  • 系列中的错误替换为时间戳字典(GH 5797

  • read_csv/read_table 现在尊重prefixkwarg ( GH 5732 )。

  • .ix通过重复索引 DataFrame 失败而选择缺失值的错误( GH 5835 )

  • 修复空 DataFrame 上的布尔比较问题(GH 5808

  • NaT对象数组中isnull 处理中的错误( GH 5443 )

  • to_datetime当传递一个np.nan或整数日期和格式字符串时出现错误( GH 5863

  • 使用 datetimelike 进行 groupby 数据类型转换时出现错误(GH 5869

  • 将空系列作为索引器处理为系列的回归(GH 5877

  • 内部缓存中的错误,与 ( GH 5727 )相关

  • 在 py3 下的 Windows 上从非文件路径读取 JSON/msgpack 的测试错误(GH 5874

  • 分配给 .ix[tuple(…)] 时出现错误(GH 5896

  • 完全重新索引面板时出现错误(GH 5905

  • 对象 dtypes 的 idxmin/max 中的错误(GH 5914

  • BusinessDay当 n>5 且 n%5==0 时向日期添加 n 天而不是偏移量时出现错误( GH 5890

  • 通过 ix ( GH 5928 )将系列分配给链式系列时出现错误

  • 创建空 DataFrame、复制然后分配时出现错误(GH 5932

  • DataFrame.tail 中存在空帧错误(GH 5846

  • resample在( GH 5862 )上传播元数据时出现错误

  • 将字符串表示形式固定为NaT“NaT”(GH 5708

  • 修复了时间戳的字符串表示形式,以显示纳秒(如果存在)(GH 5912

  • pd.match不返回经过的哨兵

  • Panel.to_frame()major_axis当是 MultiIndex( GH 5402 )时不再失败。

  • pd.read_msgpack错误推断频率的错误DateTimeIndexGH 5947

  • 修复了具有 Tz 感知日期时间和( GH 5961 )to_datetime的数组NaT

  • 当传递带有错误数据的系列时,滚动偏斜/峰度存在错误(GH 5749

  • interpolate具有日期时间索引的scipy 方法中的错误( GH 5975

  • 如果传递了带有 NaT 的混合 datetime/np.datetime64,则 NaT 比较中的错误 ( GH 5968 )

  • pd.concat修复了如果所有输入均为空则丢失数据类型信息的错误( GH 5742

  • IPython 的最新更改导致在 QTConsole 中使用以前版本的 pandas 时发出警告,现已修复。如果您使用的是旧版本并且需要抑制警告,请参阅 ( GH 5922 )。

  • 合并timedelta数据类型时出现错误(GH 5695

  • plotting.scatter_matrix 函数中的错误。对角线和非对角线图之间的对齐错误,请参阅(GH 5497)。

  • 通过 ix 使用 MultiIndex 进行串联回归 ( GH 6018 )

  • 具有多重索引的 Series.xs 中的错误 ( GH 6018 )

  • 使用类似日期和整数的混合类型的系列构造中的错误(这应该导致对象类型而不是自动转换)(GH 6028

  • 在 NumPy 1.7.1 下使用对象数组进行链式索引时可能出现段错误(GH 6026GH 6056

  • 使用非标量(例如列表)对单个元素进行花式索引设置时出现错误(GH 6043

  • to_sql不尊重if_existsGH 4110 GH 4304

  • .get(None)从 0.12 开始进行索引回归( GH 5652 )

  • 微妙的iloc索引错误,出现在(GH 6059)中

  • 将字符串插入 DatetimeIndex 的错误(GH 5818

  • 修复了 to_html/HTML repr 中的 unicode 错误(GH 6098

  • 修复了 get_options_data 中缺少的参数验证(GH 6105

  • 帧中重复列的分配错误,其中位置是切片(例如彼此相邻)(GH 6120

  • 在使用重复索引/列构造 DataFrame 期间传播 _ref_locs 时出现错误 ( GH 6121 )

  • DataFrame.apply使用混合日期式缩减时出现错误( GH 6125

  • DataFrame.append附加具有不同列的行时出现错误( GH 6129

  • 使用 rearray 和非 ns 日期时间数据类型构建 DataFrame 时出现错误 ( GH 6140 )

  • .loc使用 rhs 上的数据帧、多项目设置和类似日期时间的 setitem 索引中的错误( GH 6152

  • 修复了字典字符串比较期间query/中的错误( GH 6155 )。eval

  • query修复了单个元素的索引Series被丢弃的错误( GH 6148)。

  • HDFStore将具有多索引列的数据框附加到现有表时出现错误( GH 6167

  • 设置空数据帧时与数据类型的一致性(GH 6171

  • HDFStore即使存在指定的列规格(GH 6169),在多重索引上选择也会出现错误

  • nanops.var和1 元素中的错误ddof=1有时会返回,inf 而不是nan在某些平台上(GH 6136

  • 系列和 DataFrame 条形图中的错误忽略use_index关键字 ( GH 6209 )

  • 修复了 python3 下混合 str/int 的 groupby 中的错误;argsort失败了(GH 6212

贡献者#

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

  • 亚历克斯·罗斯伯格

  • 阿洛克·辛格 +

  • 安德鲁·伯罗斯 +

  • 安迪·海登

  • 比约恩·阿内森 +

  • 布拉德·布兰

  • 迦勒·爱泼斯坦

  • 萧启文

  • 蔡斯艾伯特+

  • 克拉克·菲茨杰拉德 +

  • 帝斯曼

  • 丹·伯肯

  • 丹尼尔·韦伯 +

  • 大卫·沃尔弗 +

  • 多兰·德鲁兹 +

  • 道格拉斯·麦克尼尔 +

  • 道格拉斯·拉德 +

  • 德拉赞·卢卡宁

  • 艾略特小号+

  • 菲利克斯·劳伦斯 +

  • 乔治·关 +

  • 纪尧姆·盖伊 +

  • 雅各布·谢尔

  • 简·瓦格纳 +

  • 杰夫·特拉特纳

  • 约翰·麦克纳马拉

  • 乔里斯·范登博什

  • 朱莉娅·埃文斯 +

  • 基兰·奥马霍尼

  • 迈克尔·沙佐 +

  • 纳文·米肖-阿格拉瓦尔 +

  • 帕特里克·奥基夫 +

  • 菲利普·克劳德

  • 罗曼·佩卡

  • 船长西博尔德

  • 斯宾塞·里昂

  • 汤姆·奥格斯普格 +

  • 汤姆·奥格斯普格

  • 阿科贝+

  • 阿基特里奇 +

  • 体重指数+

  • 布维纳尔+

  • 萧启文

  • 丹尼尔巴兰

  • 大卫+

  • 大卫辛

  • 浸入+

  • 杰雷巴克

  • 性的

  • 姆瓦斯科姆 +

  • 乌努特布

  • yp