版本 0.12.0(2013 年 7 月 24 日)#
这是 0.11.0 的主要版本,包含多项新功能和增强功能以及大量错误修复。
亮点包括一致的 I/O API 命名方案、读取 html 的例程、将 MultiIndexes 写入 csv 文件、读取和写入 STATA 数据文件、读取和写入 JSON 格式文件、Python 3 支持HDFStore
、通过 过滤 groupby 表达式filter
以及改进的replace
接受正则表达式的例程。
API 更改#
reader
I/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 上的模数和整数除法,使其与
float
dtypes 的行为类似以返回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)这种情况很少使用,并且有很多替代方案。这使得
iloc
API 保持纯粹基于位置。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
删除了绘图函数的参数。相反,绘图函数会引发一个TypeError
whendtype
对象object
提醒您尽可能避免object
使用数组,因此如果需要绘制某些内容,您应该转换为适当的数字数据类型。将关键字添加
colormap
到 DataFrame 绘图方法。接受 matplotlib 颜色图对象(即 matplotlib.cm.jet)或此类对象的字符串名称(即“jet”)。对颜色图进行采样以选择每列的颜色。请参阅颜色图以获取更多信息。 (GH 3860)
DataFrame.interpolate()
现已弃用。请使用DataFrame.fillna()
andDataFrame.replace()
代替。 (GH 3582、 GH 3675、GH 3676)的
method
和参数已被弃用axis
DataFrame.replace()
DataFrame.replace
的infer_types
参数已删除,现在默认执行转换。 (GH 3907)添加关键字
allow_duplicates
toDataFrame.insert
允许插入重复列 ifTrue
,默认值是False
(与 0.12 之前的版本相同)( GH 3679 )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]
toobject/int
( GH 3425 )数据类型的行为
datetime64
相对于某些所谓的归约操作(GH 3726)发生了变化。现在,以下操作TypeError
在对 a 执行时引发 a 并在对a 执行时Series
返回空值 ,类似于对对象的a 执行这些操作:Series
DataFrame
DataFrame
slice
sum、prod、mean、std、var、skew、kurt、corr 和 cov
read_html
现在在读取时默认为+,当 lxml 解析失败时None
则返回bs4
+ 。html5lib
尝试直到成功的解析器列表也是有效的内部
pandas
类层次结构发生了(轻微的)变化。前一个PandasObject
now 被调用PandasContainer
,新的 已成为、、、和 (+它们的基类)的PandasObject
基类PandasContainer
。目前, 提供字符串方法(来自)。 (GH 4090、GH 4092)Index
Categorical
GroupBy
SparseList
SparseArray
PandasObject
StringMixin
新的
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 的list
sopd.read_html()
和DataFrame.to_html()
不是逆矩阵。
pd.read_html()
不再执行日期字符串的硬转换(GH 3656)。警告
您可能需要安装旧版本的 BeautifulSoup4, 请参阅安装文档
添加了用于读取和写入 Stata 文件的模块:(
pandas.io.stata
GH 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_csv
read_csv
MultIndex
MultiIndex
注意:0.12 中的默认行为与之前的版本保持不变,但从 0.13 开始,默认写入和读取
MultiIndex
列将采用新格式。 (GH 3571、GH 1651、GH 3141)如果
index_col
未指定(例如,您没有索引,或用 编写),则列上的任何索引都将丢失。df.to_csv(..., index=False
names
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 NaNSeries 和 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.busdaycalendar
Numpy 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 ,但如果可能的话,它们会尝试将对象数组转换为数值数组,以便您仍然可以例如,绘制带有浮点数的对象数组。这发生在任何绘图发生之前,从而消除了任何虚假绘图的出现。
fillna
TypeError
如果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
澄清了非唯一索引支持(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)修复了 test_yahoo、test_google 中未检索符号但正在访问符号的失败测试(GH 3982、GH 3985、 GH 4028、GH 4054)
Series.hist
如果未通过,现在将从当前环境中获取数字修复了 1xN DataFrame 在 1xN 掩码上呕吐的错误 ( GH 4071 )
修复了 sharex 和 sharey 未传递给 grouped_hist 的错误(GH 4089)
DataFrame.replace
修复了当 regex=False 时未迭代嵌套字典的错误( GH 4115)修复了使用( GH 4152 )
format
中的参数时解析微秒的错误to_datetime
修复了错误触发的
PandasAutoDateLocator
错误(GH 3990)invert_xaxis
MilliSecondLocator
修复了在 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