版本 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.nan或np.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 3582、 GH 3675、GH 3676) 的method和参数已被弃用axisDataFrame.replace() DataFrame.replace的infer_types参数已删除,现在默认执行转换。 (GH 3907) 添加关键字allow_duplicatestoDataFrame.insert允许插入重复列 if True,默认值是False(与 0.12 之前的版本相同)( GH 3679 ) __nonzero__对象工具NDFrame(GH 3691,GH 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]toobject和 timedelta64[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 4090、GH 4092)IndexCategoricalGroupBySparseListSparseArrayPandasObjectStringMixin 新的StringMixin一点是,给定一个__unicode__方法,可以获得 python 2 和 python 3 兼容的字符串方法(__str__、__bytes__和 __repr__)。加上贯穿始终的琴弦安全。现在受雇于整个pandas图书馆的很多地方。 (GH 4090,GH 4092) IO 增强# pd.read_html()现在可以解析 HTML 字符串、文件或 url 并返回 DataFrame,由 @cpcloud 提供。 (GH 3477、GH 3605、GH 3606、GH 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 1226、GH 3804、GH 3876、GH 3867、GH 1305) MultiIndex列支持读写 csv 格式文件 header中的选项现在read_csv接受从中读取索引的行列表。 现在可以在和 tupleize_cols中指定该选项,以提供对通过元组列表写入和读取列的 0.12 之前的行为的兼容性。 0.12 中的默认设置是写入元组列表,而不是将元组列表解释为 列。to_csvread_csvMultIndexMultiIndex 注意:0.12 中的默认行为与之前的版本保持不变,但从 0.13 开始,默认写入和读取MultiIndex列将采用新格式。 (GH 3571、GH 1651、GH 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_name并value_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必须是一个函数,该函数应用于整个组并返回True或False。 另一个有用的操作是过滤掉属于只有几个成员的组的元素。 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 为object(GH 1818、 GH 3572、GH 3911、GH 3912 ),绘图函数现在会在尝试绘制任何内容之前引发 a ,但如果可能的话,它们会尝试将对象数组转换为数值数组,以便您仍然可以例如,绘制带有浮点数的对象数组。这发生在任何绘图发生之前,从而消除了任何虚假绘图的出现。 fillnaTypeError如果value参数是列表或元组,方法现在会引发 a 。 Series.str现在支持迭代(GH 3638)。您可以迭代Series.每次迭代都会Series在原始的每个索引处生成一个带有单个字符的 Series或NaN。例如, 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 3455,GH 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 3910,GH 3914) 修复了打开过多套接字从而导致连接重置问题的测试问题(GH 3982、GH 3985、GH 4028、 GH 4054) 修复了 test_yahoo、test_google 中未检索符号但正在访问符号的失败测试(GH 3982、GH 3985、 GH 4028、GH 4054) Series.hist如果未通过,现在将从当前环境中获取数字 修复了 1xN DataFrame 在 1xN 掩码上呕吐的错误 ( GH 4071 ) 修复了在 python3 下运行tox时 pickle 导入以不兼容的方式重写的问题(GH 4062、GH 4063) 修复了 sharex 和 sharey 未传递给 grouped_hist 的错误(GH 4089) DataFrame.replace修复了当 regex=False 时未迭代嵌套字典的错误( GH 4115) 修复了使用( GH 4152 )format 中的参数时解析微秒的错误to_datetime 修复了错误触发的PandasAutoDateLocator错误(GH 3990)invert_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