版本 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.compat
和pandas.util.py3compat
已经合并到pandas.compat
中。pandas.compat
现在包含许多允许2/3兼容的函数。它包含范围、过滤、映射和压缩的列表和迭代器版本,以及其他必要的Python 3兼容元素。lmap
、lzip
、lrange
和lfilter
都生成列表而不是迭代器,以与numpy
、下标和pandas
构造函数兼容。(GH 4384, GH 4375, GH 4372)Series.get
使用负索引器现在返回与[]
相同的结果 (GH 4390)对
Index
和MultiIndex
处理元数据 (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(
Series
、DataFrame
、Panel
、Panel4D
、SparsePanel
等),现在支持全套算术运算符和算术灵活方法(add、sub、mul 等)。SparsePanel
不支持与非标量进行pow
或mod
运算。(GH 3765)Series
和DataFrame
现在有一个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.argmin
和Series.argmax
现在被别名为Series.idxmin
和Series.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_csv
和read_csv
都是False
。在 0.12 版本中有公平的警告 (GH 3604)display.max_seq_len
的默认值现在是 100 而不是None
。这会在各种地方激活长序列的截断显示(“…”)。(GH 3391)
弃用#
在 0.13.0 版本中已弃用
索引 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)添加了一个
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)。在
append
中添加关键字dropna=True
以更改是否不将所有 nan 行写入存储(默认是True
,不写入所有 nan 行),也可以通过选项io.hdf.dropna_table
进行设置 (GH 4625)传递存储创建参数;可用于支持内存中的存储
DataFrame repr 变化#
现在,DataFrame
的 HTML 和纯文本表示在表格超过一定大小后会显示截断视图,而不是切换到简短信息视图 (GH 4886, GH 5550)。这使得表示在小 DataFrame 变大时更加一致。
要获取信息视图,请调用 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_method
和ind
,这些参数分别传递给 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')
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
此外,
interpolate
的method
参数已扩展为包括'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
实验性#
新的
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.eval
,DataFrame
有一个新的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 版本中,有一个主要的重构,主要是将 Series
从 NDFrame
子类化,NDFrame
是目前 DataFrame
和 Panel
的基类,以统一方法和行为。Series 以前直接从 ndarray
子类化。(GH 4080, GH 3862, GH 816)
警告
从 < 0.13.0 开始有两个潜在的不兼容性
使用某些 numpy 函数以前会在传递
Series
作为参数时返回一个Series
。这似乎只影响np.ones_like
、np.empty_like
、np.diff
和np.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
的一部分)
这些是使
Panel
与DataFrame
更加一致的 API 变化在
Panel
上使用swapaxes
并指定相同的轴现在返回一个副本支持属性访问以进行设置
filter 支持与原始
DataFrame
filter 相同的 API
没有参数调用 Reindex 现在将返回输入对象的副本
TimeSeries
现在是Series
的别名。属性is_time_series
可以用来区分(如果需要)重构 Sparse 对象以使用 BlockManager
在内部创建了一种新的块类型,
SparseBlock
,它可以容纳多数据类型并且是不可合并的。SparseSeries
和SparseDataFrame
现在从其层次结构(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)
重构
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
在同时传递append
和table
参数时会引发错误 (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)
修复了
PeriodIndex.map
中的一个错误,其中使用str
会返回索引的字符串表示形式 (GH 4136)在使用自定义 matplotlib 默认颜色时修复了
test_time_series_plot_color_with_empty_kwargs
测试失败 (GH 4345)修复 stata IO 测试的运行。现在使用临时文件进行写入 (GH 4353)
修复了一个问题,即对于整数值的帧,
DataFrame.sum
比DataFrame.mean
慢 (GH 4365)read_html
测试现在可以在 Python 2.6 上工作 (GH 4351)修复了
network
测试抛出NameError
的错误,因为局部变量未定义 (GH 4381)在
to_json
中,如果传递的orient
会导致由于重复索引而丢失数据,则引发异常 (GH 4359)在
to_json
中,修复日期处理,使毫秒成为默认的时间戳,如文档字符串所述 (GH 4362)。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)
修复了一个py3兼容性问题,其中字节被表示为元组 (GH 4455)
如果项目命名为 ‘a’,修复固定面板属性命名冲突 (GH 3440)
修复了一个在绘图时重复索引引发的问题 (GH 4486)
修复了一个问题,即 cumsum 和 cumprod 在 bool 类型下无法工作 (GH 4170, GH 4440)
修复了在
xs
中返回不正确变暗对象的面板切片问题 (GH 4016)带有转置框架的固定面板分配 (GH 3830)
使用 Panel 和作为需要对齐的值的 Panel 进行集合索引时引发 (GH 3777)
修复了对具有多个数据类型的重复 MultiIndex 进行排序的问题 (GH 4516)
修复了
DataFrame.set_values
中的一个错误,该错误在扩展索引时导致名称属性丢失。(GH 3742, GH 4039)修复了在
MultiIndex
上设置单个names
、levels
和labels
时未进行验证的问题 (GH 3714, GH 4039)在 pivot_table 中修复 (GH 3334)。如果值是索引,则边距不会计算。
修复在操作日期时间时,右侧为
np.timedelta64
或np.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.rename
和MultiIndex.rename
等的一些不一致性。(GH 4718, GH 4628)在使用
iloc/loc
时遇到横截面和重复索引的错误 (GH 4726)使用
QUOTE_NONE
与to_csv
导致Exception
的 Bug。(GH 4328)当右侧长度不正确时,Series 索引未引发错误的 Bug (GH 2702)
在多索引中使用部分字符串选择作为多索引的一部分时出现的错误 (GH 4758)
在非唯一索引的索引上重新索引时,现在会引发
ValueError
(GH 4746)在
loc/ix
设置中使用 MultiIndex 轴和 NumPy 数组的单个索引器时出现的错误,相关于 (GH 3777)iloc
中使用切片索引失败的错误 (GH 4771)在
read_fwf
中没有 colspecs 或 width 的错误信息不正确。(GH 4774)修复了在 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)FrozenNDArray
和FrozenList
的固定字符串方法 (GH 4929)修复了在索引扩增场景中设置无效或超出范围值的错误 (GH 4940)
对空 Series 进行 fillna 的测试 (GH 4346),感谢 @immerrr
在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
对象现在可以出现在与Series
或DataFrame
对象的比较操作的左侧 (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)。修复了一个
DatetimeIndex
与PeriodIndex
连接导致堆栈溢出的错误 (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)。还添加了一些用于获取区域设置和使用上下文管理器设置区域设置的实用程序。
构造函数中的复合数据类型会引发
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 方法
transform
和filter
可以用于具有重复(非唯一)索引的 Series 和 DataFrames。(GH 4620)修复在 repr 中不打印空系列名称的问题 (GH 4651)
默认情况下,使测试在临时目录中创建临时文件。(GH 5419)
pd.to_timedelta
对标量返回一个标量 (GH 5410)pd.to_timedelta
接受NaN
和NaT
,返回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