版本 0.12.0(2013 年 7 月 24 日)#

这是 0.11.0 的主要版本,包含多项新功能和增强功能以​​及大量错误修复。

亮点包括一致的 I/O API 命名方案、读取 html 的例程、将 MultiIndexes 写入 csv 文件、读取和写入 STATA 数据文件、读取和写入 JSON 格式文件、Python 3 支持HDFStore、通过 过滤 groupby 表达式filter以及改进的replace接受正则表达式的例程。

API 更改#

  • readerI/O API 现在与一组顶级函数的访问更加一致,就像pd.read_csv()通常返回一个pandas对象一样。

    • read_csv

    • read_excel

    • read_hdf

    • read_sql

    • read_json

    • read_html

    • read_stata

    • read_clipboard

    相应的writer函数是对象方法,可以像这样访问df.to_csv()

    • to_csv

    • to_excel

    • to_hdf

    • to_sql

    • to_json

    • to_html

    • to_stata

    • to_clipboard

  • 修复 Series、DataFrame 上的模数和整数除法,使其与floatdtypes 的行为类似以返回 np.nannp.inf酌情 ( GH 3590 )。这纠正了 numpy 处理integer 和数据类型不同的错误float

    In [1]: p = pd.DataFrame({"first": [4, 5, 8], "second": [0, 0, 3]})
    
    In [2]: p % 0
    Out[2]: 
       first  second
    0    NaN     NaN
    1    NaN     NaN
    2    NaN     NaN
    
    In [3]: p % p
    Out[3]: 
       first  second
    0    0.0     NaN
    1    0.0     NaN
    2    0.0     0.0
    
    In [4]: p / p
    Out[4]: 
       first  second
    0    1.0     NaN
    1    1.0     NaN
    2    1.0     1.0
    
    In [5]: p / 0
    Out[5]: 
       first  second
    0    inf     NaN
    1    inf     NaN
    2    inf     inf
    
  • 如果组是唯一的,则添加squeeze关键字以groupby允许从 DataFrame -> Series 进行缩减。这是从 0.10.1 开始的回归。我们正在恢复之前的行为。这意味着无论组是否唯一,groupby 都会返回相同形状的对象。使用 ( GH 3596 )恢复此问题 ( GH 2893 ) 。

    In [2]: df2 = pd.DataFrame([{"val1": 1, "val2": 20},
       ...:                     {"val1": 1, "val2": 19},
       ...:                     {"val1": 1, "val2": 27},
       ...:                     {"val1": 1, "val2": 12}])
    
    In [3]: def func(dataf):
       ...:     return dataf["val2"] - dataf["val2"].mean()
       ...:
    
    In [4]: # squeezing the result frame to a series (because we have unique groups)
       ...: df2.groupby("val1", squeeze=True).apply(func)
    Out[4]:
    0    0.5
    1   -0.5
    2    7.5
    3   -7.5
    Name: 1, dtype: float64
    
    In [5]: # no squeezing (the default, and behavior in 0.10.1)
       ...: df2.groupby("val1").apply(func)
    Out[5]:
    val2    0    1    2    3
    val1
    1     0.5 -0.5  7.5 -7.5
    
  • iloc当带有基于标签的索引器掩码的布尔索引(例如布尔系列,即使具有整数标签)将引发时引发。由于iloc 纯粹基于位置,该系列上的标签不可对齐(GH 3631

    这种情况很少使用,并且有很多替代方案。这使得 ilocAPI 保持纯粹基于位置。

    In [6]: df = pd.DataFrame(range(5), index=list("ABCDE"), columns=["a"])
    
    In [7]: mask = df.a % 2 == 0
    
    In [8]: mask
    Out[8]: 
    A     True
    B    False
    C     True
    D    False
    E     True
    Name: a, dtype: bool
    
    # this is what you should use
    In [9]: df.loc[mask]
    Out[9]: 
       a
    A  0
    C  2
    E  4
    
    # this will work as well
    In [10]: df.iloc[mask.values]
    Out[10]: 
       a
    A  0
    C  2
    E  4
    

    df.iloc[mask]将提出一个ValueError

  • raise_on_error删除了绘图函数的参数。相反,绘图函数会引发一个TypeErrorwhendtype对象object提醒您尽可能避免object使用数组,因此如果需要绘制某些内容,您应该转换为适当的数字数据类型。

  • 将关键字添加colormap到 DataFrame 绘图方法。接受 matplotlib 颜色图对象(即 matplotlib.cm.jet)或此类对象的字符串名称(即“jet”)。对颜色图进行采样以选择每列的颜色。请参阅颜色图以获取更多信息。 (GH 3860

  • DataFrame.interpolate()现已弃用。请使用 DataFrame.fillna()andDataFrame.replace()代替。 (GH 3582GH 3675GH 3676

  • method和参数已被弃用axisDataFrame.replace()

  • DataFrame.replaceinfer_types参数已删除,现在默认执行转换。 (GH 3907

  • 添加关键字allow_duplicatestoDataFrame.insert允许插入重复列 if True,默认值是False(与 0.12 之前的版本相同)( GH 3679 )

  • __nonzero__对象工具NDFrameGH 3691GH 3696

  • IO接口

    • 添加了顶级函数read_excel来替换以下内容,原始 API 已弃用,并将在未来版本中删除

      from pandas.io.parsers import ExcelFile
      
      xls = ExcelFile("path_to_file.xls")
      xls.parse("Sheet1", index_col=None, na_values=["NA"])
      

      import pandas as pd
      
      pd.read_excel("path_to_file.xls", "Sheet1", index_col=None, na_values=["NA"])
      
    • read_sql添加了相当于以下的顶级函数

      from pandas.io.sql import read_frame
      
      read_frame(...)
      
  • DataFrame.to_html现在DataFrame.to_latex接受他们的第一个参数的路径(GH 3702

  • 不允许 astypes 除了datetime64[ns]toobjecttimedelta64[ns]to object/int( GH 3425 )

  • 数据类型的行为datetime64相对于某些所谓的归约操作(GH 3726)发生了变化。现在,以下操作TypeError在对 a 执行时引发 a 并在对a 执行时Series返回空值 ,类似于对对象的a 执行这些操作:SeriesDataFrameDataFrameslice

    • sum、prod、mean、std、var、skew、kurt、corr 和 cov

  • read_html现在在读取时默认为+,当 lxml 解析失败时None则返回 bs4+ 。html5lib尝试直到成功的解析器列表也是有效的

  • 内部pandas类层次结构发生了(轻微的)变化。前一个PandasObjectnow 被调用PandasContainer,新的 已成为、、、和 (+它们的基类)的PandasObject基类PandasContainer。目前, 提供字符串方法(来自)。 (GH 4090GH 4092IndexCategoricalGroupBySparseListSparseArrayPandasObjectStringMixin

  • 新的StringMixin一点是,给定一个__unicode__方法,可以获得 python 2 和 python 3 兼容的字符串方法(__str____bytes____repr__)。加上贯穿始终的琴弦安全。现在受雇于整个pandas图书馆的很多地方。 (GH 4090GH 4092

IO 增强#

  • pd.read_html()现在可以解析 HTML 字符串、文件或 url 并返回 DataFrame,由 @cpcloud 提供。 (GH 3477GH 3605GH 3606GH 3616)。它适用于单个解析器后端:BeautifulSoup4 + html5lib请参阅文档

    您可以像这样pd.read_html()读取输出DataFrame.to_html()

    In [11]: df = pd.DataFrame({"a": range(3), "b": list("abc")})
    
    In [12]: print(df)
       a  b
    0  0  a
    1  1  b
    2  2  c
    
    In [13]: html = df.to_html()
    
    In [14]: alist = pd.read_html(html, index_col=0)
    
    In [15]: print(df == alist[0])
          a     b
    0  True  True
    1  True  True
    2  True  True
    

    请注意,alist这里是 Python 的listsopd.read_html()DataFrame.to_html()不是逆矩阵。

    • pd.read_html()不再执行日期字符串的硬转换(GH 3656)。

    警告

    您可能需要安装旧版本的 BeautifulSoup4, 请参阅安装文档

  • 添加了用于读取和写入 Stata 文件的模块:(pandas.io.stataGH 1512)可通过用于read_stata读取的顶级函数和to_stata用于写入的 DataFrame 方法访问,请参阅文档

  • 添加了用于读取和写入 json 格式文件的模块:pandas.io.json 可通过用于read_json读取的顶级函数和to_json用于写入的 DataFrame 方法进行访问,请参阅文档 各种问题(GH 1226GH 3804GH 3876GH 3867GH 1305

  • MultiIndex列支持读写 csv 格式文件

    • header中的选项现在read_csv接受从中读取索引的行列表。

    • 现在可以在和 tupleize_cols中指定该选项,以提供对通过元组列表写入和读取列的 0.12 之前的行为的兼容性。 0.12 中的默认设置是写入元组列表,而不是将元组列表解释为 列。to_csvread_csvMultIndexMultiIndex

      注意:0.12 中的默认行为与之前的版本保持不变,但从 0.13 开始,默认写入和读取MultiIndex列将采用新格式。 (GH 3571GH 1651GH 3141

    • 如果index_col未指定(例如,您没有索引,或用 编写),则列上的任何索引都将丢失df.to_csv(..., index=Falsenames

      In [16]: mi_idx = pd.MultiIndex.from_arrays([[1, 2, 3, 4], list("abcd")], names=list("ab"))
      
      In [17]: mi_col = pd.MultiIndex.from_arrays([[1, 2], list("ab")], names=list("cd"))
      
      In [18]: df = pd.DataFrame(np.ones((4, 2)), index=mi_idx, columns=mi_col)
      
      In [19]: df.to_csv("mi.csv")
      
      In [20]: print(open("mi.csv").read())
      c,,1,2
      d,,a,b
      a,b,,
      1,a,1.0,1.0
      2,b,1.0,1.0
      3,c,1.0,1.0
      4,d,1.0,1.0
      
      
      In [21]: pd.read_csv("mi.csv", header=[0, 1, 2, 3], index_col=[0, 1])
      Out[21]: 
      c                    1                  2
      d                    a                  b
      a   Unnamed: 2_level_2 Unnamed: 3_level_2
      1                  1.0                1.0
      2 b                1.0                1.0
      3 c                1.0                1.0
      4 d                1.0                1.0
      
  • 支持HDFStore(via ) Python3PyTables 3.0.0

  • 迭代器支持通过read_hdf迭代完成时自动打开和关闭存储。这仅适用于表格

    In [25]: path = 'store_iterator.h5'
    
    In [26]: pd.DataFrame(np.random.randn(10, 2)).to_hdf(path, 'df', table=True)
    
    In [27]: for df in pd.read_hdf(path, 'df', chunksize=3):
       ....:     print(df)
       ....:
              0         1
    0  0.713216 -0.778461
    1 -0.661062  0.862877
    2  0.344342  0.149565
              0         1
    3 -0.626968 -0.875772
    4 -0.930687 -0.218983
    5  0.949965 -0.442354
              0         1
    6 -0.402985  1.111358
    7 -0.241527 -0.670477
    8  0.049355  0.632633
              0         1
    9 -1.502767 -1.225492
    
  • read_csv现在,当文件不包含列(例如所有换行符)时,将抛出信息更丰富的错误消息

其他增强功能#

  • DataFrame.replace()现在允许包含 Series对象数据类型的正则表达式。请参阅常规文档中的示例部分 通过字符串表达式替换

    例如你可以这样做

    In [22]: df = pd.DataFrame({"a": list("ab.."), "b": [1, 2, 3, 4]})
    
    In [23]: df.replace(regex=r"\s*\.\s*", value=np.nan)
    Out[23]: 
         a  b
    0    a  1
    1    b  2
    2  NaN  3
    3  NaN  4
    

    将所有出现的字符串替换'.'为零个或多个周围空白的实例NaN

    常规字符串替换仍然按预期工作。例如,你可以这样做

    In [24]: df.replace(".", np.nan)
    Out[24]: 
         a  b
    0    a  1
    1    b  2
    2  NaN  3
    3  NaN  4
    

    将所有出现的字符串替换'.'NaN.

  • pd.melt()现在接受可选参数var_namevalue_name 指定返回的 DataFrame 的自定义列名称。

  • pd.set_option()现在允许 N 个选项、值对 ( GH 3667 )。

    假设我们有一个选择'a.b'和另一个选择'b.c'。我们可以同时设置它们:

    In [31]: pd.get_option('a.b')
    Out[31]: 2
    
    In [32]: pd.get_option('b.c')
    Out[32]: 3
    
    In [33]: pd.set_option('a.b', 1, 'b.c', 4)
    
    In [34]: pd.get_option('a.b')
    Out[34]: 1
    
    In [35]: pd.get_option('b.c')
    Out[35]: 4
    
  • 组对象的方法filter返回原始对象的子集。假设我们只想取出属于组和大于 2 的组的元素。

    In [25]: sf = pd.Series([1, 1, 2, 3, 3, 3])
    
    In [26]: sf.groupby(sf).filter(lambda x: x.sum() > 2)
    Out[26]: 
    3    3
    4    3
    5    3
    dtype: int64
    

    的参数filter必须是一个函数,该函数应用于整个组并返回TrueFalse

    另一个有用的操作是过滤掉属于只有几个成员的组的元素。

    In [27]: dff = pd.DataFrame({"A": np.arange(8), "B": list("aabbbbcc")})
    
    In [28]: dff.groupby("B").filter(lambda x: len(x) > 2)
    Out[28]: 
       A  B
    2  2  b
    3  3  b
    4  4  b
    5  5  b
    

    或者,我们可以返回类似索引的对象,而不是删除有问题的组,其中未通过过滤器的组将填充 NaN。

    In [29]: dff.groupby("B").filter(lambda x: len(x) > 2, dropna=False)
    Out[29]: 
         A    B
    0  NaN  NaN
    1  NaN  NaN
    2  2.0    b
    3  3.0    b
    4  4.0    b
    5  5.0    b
    6  NaN  NaN
    7  NaN  NaN
    
  • Series 和 DataFrame hist 方法现在采用figsize参数(GH 3834

  • DatetimeIndexes 不再尝试在连接操作期间转换混合整数索引 ( GH 3877 )

  • Timestamp.min 和 Timestamp.max 现在代表有效的 Timestamp 实例,而不是默认的 datetime.min 和 datetime.max (分别),感谢@SleepingPills

  • read_html现在当没有找到表并且检测到 BeautifulSoup==4.2.0 时会引发(GH 4214

实验特性#

  • 添加了实验CustomBusinessDay类以支持DateOffsets 自定义假日日历和自定义周掩码。 (GH 2301

    笔记

    这使用numpy.busdaycalendarNumpy 1.7 中引入的 API,因此需要 Numpy 1.7.0 或更高版本。

    In [30]: from pandas.tseries.offsets import CustomBusinessDay
    
    In [31]: from datetime import datetime
    
    # As an interesting example, let's look at Egypt where
    # a Friday-Saturday weekend is observed.
    In [32]: weekmask_egypt = "Sun Mon Tue Wed Thu"
    
    # They also observe International Workers' Day so let's
    # add that for a couple of years
    In [33]: holidays = ["2012-05-01", datetime(2013, 5, 1), np.datetime64("2014-05-01")]
    
    In [34]: bday_egypt = CustomBusinessDay(holidays=holidays, weekmask=weekmask_egypt)
    
    In [35]: dt = datetime(2013, 4, 30)
    
    In [36]: print(dt + 2 * bday_egypt)
    2013-05-05 00:00:00
    
    In [37]: dts = pd.date_range(dt, periods=5, freq=bday_egypt)
    
    In [38]: print(pd.Series(dts.weekday, dts).map(pd.Series("Mon Tue Wed Thu Fri Sat Sun".split())))
    2013-04-30    Tue
    2013-05-02    Thu
    2013-05-05    Sun
    2013-05-06    Mon
    2013-05-07    Tue
    Freq: C, dtype: object
    

Bug修复

  • TypeError如果关联对象的 dtype 为objectGH 1818GH 3572GH 3911GH 3912 ),绘图函数现在会在尝试绘制任何内容之前引发 a ,但如果可能的话,它们会尝试将对象数组转换为数值数组,以便您仍然可以例如,绘制带有浮点数的对象数组。这发生在任何绘图发生之前,从而消除了任何虚假绘图的出现。

  • fillnaTypeError如果value参数是列表或元组,方法现在会引发 a 。

  • Series.str现在支持迭代(GH 3638)。您可以迭代Series.每次迭代都会Series在原始的每个索引处生成一个带有单个字符的 SeriesNaN。例如,

    In [38]: strs = "go", "bow", "joe", "slow"
    
    In [32]: ds = pd.Series(strs)
    
    In [33]: for s in ds.str:
        ...:     print(s)
    
    0    g
    1    b
    2    j
    3    s
    dtype: object
    0    o
    1    o
    2    o
    3    l
    dtype: object
    0    NaN
    1      w
    2      e
    3      o
    dtype: object
    0    NaN
    1    NaN
    2    NaN
    3      w
    dtype: object
    
    In [41]: s
    Out[41]:
    0    NaN
    1    NaN
    2    NaN
    3      w
    dtype: object
    
    In [42]: s.dropna().values.item() == "w"
    Out[42]: True
    

    迭代器生成的最后一个元素将是 a ,Series其中包含 中最长字符串的最后一个元素,Series所有其他元素均为NaN。这里的since'slow'是最长的字符串,并且没有其他具有相同长度的字符串,'w'是yield中唯一的非空字符串Series

  • HDFStore

    • 将在娱乐中保留索引属性(freq、tz、name)(GH 3499

    • AttributeConflictWarning如果您尝试以与现有索引不同的频率附加索引,或者尝试以与现有索引不同的名称附加索引,则会发出警告

    • 支持以时区为 data_columns 的类似日期的列(GH 2852

  • 澄清了非唯一索引支持(GH 3468)。

    • 修复将新索引分配给 DataFrame 中的重复索引会失败的问题 ( GH 3468 )

    • 修复具有重复索引的 DataFrame 的构造

    • ref_locs 支持允许跨 dtypes 的重复索引,允许 iget 支持始终查找索引(甚至跨 dtypes)(GH 2194

    • 具有非唯一索引的 DataFrame 上的 applymap 现在可以工作(删除警告)(GH 2786),并修复(GH 3230

    • 修复 to_csv 以处理非唯一列(GH 3495

    • 使用 getitem 的重复索引将以正确的顺序返回项目(GH 3455GH 3457)并处理丢失的元素,例如唯一索引(GH 3561

    • 带有和空 DataFrame.from_records 的重复索引将返回正确的帧(GH 3562

    • 当跨数据类型重复时,连接生成非唯一列已修复(GH 3602

    • 允许插入/删除非唯一列(GH 3679

    • 通过切片loc和朋友修复非唯一索引(GH 3659

    • 允许插入/删除非唯一列(GH 3679

    • 扩展reindex以正确处理非唯一索引(GH 3679

    • DataFrame.itertuples()现在适用于具有重复列名称的框架(GH 3873

    • iloc通过(GH 4017)进行非唯一索引的错误;添加了基于位置的拍摄takeable参数 reindex

    • .ix/.loc允许通过and __getitem__( GH 4246 )进行系列非唯一索引

    • .ix/.loc修复了( GH 4280 )的非唯一索引内存分配问题

  • DataFrame.from_records不接受空的重新排列(GH 3682

  • read_html现在可以正确跳过测试(GH 3741

  • DataFrame.replace修复了参数中编译的正则表达式to_replace不起作用的错误( GH 3907

  • 改进了network测试装饰器以捕获IOError(因此 URLError也是如此)。添加了with_connectivity_check装饰器以允许显式检查作为代理的网站以查看是否存在网络连接。另外,optional_args还有新的装饰器工厂。 (GH 3910GH 3914

  • 修复了打开过多套接字从而导致连接重置问题的测试问题(GH 3982GH 3985GH 4028GH 4054

  • 修复了 test_yahoo、test_google 中未检索符号但正在访问符号的失败测试(GH 3982GH 3985GH 4028GH 4054

  • Series.hist如果未通过,现在将从当前环境中获取数字

  • 修复了 1xN DataFrame 在 1xN 掩码上呕吐的错误 ( GH 4071 )

  • 修复了在 python3 下运行tox时 pickle 导入以不兼容的方式重写的问题(GH 4062GH 4063

  • 修复了 sharex 和 sharey 未传递给 grouped_hist 的错误(GH 4089

  • DataFrame.replace修复了当 regex=False 时未迭代嵌套字典的错误( GH 4115

  • 修复了使用( GH 4152 )format 中的参数时解析微秒的错误to_datetime

  • 修复了错误触发的PandasAutoDateLocator错误(GH 3990invert_xaxisMilliSecondLocator

  • 修复了在 matplotlib 1.1.1 的无效颜色图上不会引发的绘图错误(GH 4215

  • DataFrame.plot(kind='kde')修复了( GH 4216 )中显示的图例

  • 修复了索引切片不携带名称属性的错误(GH 4226

  • DatetimeIndex修复了在特定时区使用字符串数组初始化的错误( GH 4229

  • 修复了 html5lib 未正确跳过的错误(GH 4265

  • 修复了 get_data_famafrench 未使用正确文件边缘的错误(GH 4281

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

贡献者#

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

  • 安迪·海登

  • 常社

  • 克里斯托弗·惠兰

  • 达米恩·加劳德

  • 丹·艾伦

  • 丹·伯肯

  • 迪特·范登布斯切

  • 德拉赞·卢卡宁

  • 加博尔·利普塔克 +

  • 杰夫·梅伦 +

  • 杰夫·特拉特纳 +

  • 杰弗里·特拉特纳 +

  • 乔纳森·德韦德 +

  • 乔里斯·范登博什 +

  • 尤拉吉·尼兹南 +

  • 卡梅尔·艾利森

  • 凯尔西·乔达尔

  • 凯文·斯通 +

  • 基兰·奥马霍尼

  • 凯尔·迈耶 +

  • 迈克·凯利 +

  • PKEuS+

  • 帕特里克·奥布莱恩 +

  • 菲利普·克劳德

  • 理查德·霍兴伯格 +

  • 船长西博尔德

  • 安眠药+

  • 托比亚斯·勃兰特

  • 汤姆·法恩鲍尔 +

  • 汤姆·奥格斯普格 +

  • 特伦特·豪克 +

  • 韦斯·麦金尼

  • 沃特·奥弗迈尔

  • 雅罗斯拉夫·哈尔琴科

  • 康麦+

  • 丹尼尔巴兰+

  • 大卫辛 +

  • 迪特v77

  • 多张+

  • 埃杰恩斯 +

  • 格利普+

  • 杰尼兹南 +

  • 杰雷巴克

  • 性的

  • 尼普红魔 +

  • 奥吉亚基诺 +

  • 石大+

  • 蒂姆·史密斯 +

  • 蒂米

  • yp