版本 0.15.0(2014 年 10 月 18 日)#
这是 0.14.1 的主要版本,包括少量 API 更改、一些新功能、增强功能和性能改进以及大量错误修复。我们建议所有用户升级到此版本。
警告
pandas >= 0.15.0 将不再支持与 NumPy 版本 < 1.7.0 的兼容性。如果您想使用最新版本的 pandas,请升级到 NumPy >= 1.7.0 ( GH 7711 )
亮点包括:
该
Categorical
类型已集成为一流的 pandas 类型,请参见此处新的标量类型
Timedelta
和新的索引类型TimedeltaIndex
,请参见此处.dt
Series 的新 datetimelike 属性访问器,请参阅Datetimelike 属性新的 DataFrame 默认显示
df.info()
包含内存使用情况,请参阅内存使用情况read_csv
现在默认情况下解析时会忽略空行,请参阅此处在集合操作中使用索引的 API 更改,请参阅此处
时区处理的增强功能,请参见此处
对滚动和膨胀力矩函数进行了大量改进,请参见此处
类的内部重构
Index
不再是子类ndarray
,请参阅内部重构PyTables
放弃对3.0.0 以下版本和numexpr
2.1 以下版本的支持( GH 7990 )将字符串方法文档拆分为“使用文本数据”
警告
在 0.15.0 中Index
,内部已被重构为不再是 subclassndarray
而是 subclass PandasObject
,类似于 pandas 对象的其余部分。此更改允许非常轻松地子分类和创建新索引类型。这应该是一个透明的更改,只有非常有限的 API 影响(请参阅内部重构)
警告
重构将Categorical
两个参数构造函数从“代码/标签和级别”更改为“值和级别(现在称为“类别”)”。这可能会导致微妙的错误。如果您
Categorical
直接使用,请在更新到此 pandas 版本之前审核您的代码并将其更改为使用from_codes()
构造函数。在这里查看更多内容Categorical
新功能#
系列/数据帧中的分类#
Categorical
现在可以包含Series
并DataFrames
获得新的操作方法。感谢 Jan Schulz 提供的大部分 API/实现。 ( GH 3943、GH 5313、GH 5314、
GH 7444、GH 7839、GH 7848、GH 7864 、 GH 7914 、GH 7768、GH 8006、GH 3678、
GH 8075、GH 8076、GH 81 43、GH 8453、GH 8518)。
In [1]: df = pd.DataFrame({"id": [1, 2, 3, 4, 5, 6],
...: "raw_grade": ['a', 'b', 'b', 'a', 'a', 'e']})
...:
In [2]: df["grade"] = df["raw_grade"].astype("category")
In [3]: df["grade"]
Out[3]:
0 a
1 b
2 b
3 a
4 a
5 e
Name: grade, Length: 6, dtype: category
Categories (3, object): ['a', 'b', 'e']
# Rename the categories
In [4]: df["grade"] = df["grade"].cat.rename_categories(["very good", "good", "very bad"])
# Reorder the categories and simultaneously add the missing categories
In [5]: df["grade"] = df["grade"].cat.set_categories(["very bad", "bad",
...: "medium", "good", "very good"])
...:
In [6]: df["grade"]
Out[6]:
0 very good
1 good
2 good
3 very good
4 very good
5 very bad
Name: grade, Length: 6, dtype: category
Categories (5, object): ['very bad', 'bad', 'medium', 'good', 'very good']
In [7]: df.sort_values("grade")
Out[7]:
id raw_grade grade
5 6 e very bad
1 2 b good
2 3 b good
0 1 a very good
3 4 a very good
4 5 a very good
[6 rows x 3 columns]
In [8]: df.groupby("grade", observed=False).size()
Out[8]:
grade
very bad 1
bad 0
medium 0
good 2
very good 3
Length: 5, dtype: int64
pandas.core.group_agg
并被pandas.core.factor_agg
移除。作为替代方案,构建一个数据框并使用df.groupby(<group>).agg(<func>)
.Categorical
不再支持向构造函数提供“代码/标签和级别” 。向构造函数提供两个参数现在被解释为“值和级别(现在称为“类别”)”。请更改您的代码以使用from_codes()
构造函数。该
Categorical.labels
属性已重命名为Categorical.codes
只读。如果您想操作代码,请使用Categoricals 上的 API 方法之一 。该
Categorical.levels
属性已重命名为Categorical.categories
.
TimedeltaIndex/标量#
我们引入了一种新的标量类型Timedelta
,它是 的子类datetime.timedelta
,其行为方式类似,但允许与np.timedelta64
类型以及大量自定义表示、解析和属性兼容。这种类型与Timestamp
的工作方式非常相似datetimes
。对于该类型来说,这是一个很好的 API 框。请参阅文档。 (GH 3009、GH 4533、GH 8209、GH 8187、GH 8190、GH 7869、GH 7661、GH 8345、GH 8471)
警告
Timedelta
标量(和TimedeltaIndex
)组件字段与对象上的组件字段不同datetime.timedelta
。例如,.seconds
在对象上返回、和datetime.timedelta
之间组合的总秒数。相比之下,pandas分别细分为小时、分钟、微秒和纳秒。hours
minutes
seconds
Timedelta
# Timedelta accessor
In [9]: tds = pd.Timedelta('31 days 5 min 3 sec')
In [10]: tds.minutes
Out[10]: 5L
In [11]: tds.seconds
Out[11]: 3L
# datetime.timedelta accessor
# this is 5 minutes * 60 + 3 seconds
In [12]: tds.to_pytimedelta().seconds
Out[12]: 303
注意:从 v0.16.0 开始,情况不再如此,datetime.timedelta
引入了完全兼容性。请参阅
0.16.0 Whatsnew 条目
警告
在 0.15.0 之前,将为类列表/系列输入pd.to_timedelta
返回一个,为标量输入返回一个。现在,它将为类似列表的输入、系列输入和标量输入返回一个。Series
np.timedelta64
TimedeltaIndex
Series
Timedelta
pd.to_timedelta
现在的论点是(arg,unit='ns',box=True,coerce=False)
,以前是,(arg,box=True,unit='ns')
因为这些更符合逻辑。
构造一个标量
In [9]: pd.Timedelta('1 days 06:05:01.00003')
Out[9]: Timedelta('1 days 06:05:01.000030')
In [10]: pd.Timedelta('15.5us')
Out[10]: Timedelta('0 days 00:00:00.000015500')
In [11]: pd.Timedelta('1 hour 15.5us')
Out[11]: Timedelta('0 days 01:00:00.000015500')
# negative Timedeltas have this string repr
# to be more consistent with datetime.timedelta conventions
In [12]: pd.Timedelta('-1us')
Out[12]: Timedelta('-1 days +23:59:59.999999')
# a NaT
In [13]: pd.Timedelta('nan')
Out[13]: NaT
访问字段Timedelta
In [14]: td = pd.Timedelta('1 hour 3m 15.5us')
In [15]: td.seconds
Out[15]: 3780
In [16]: td.microseconds
Out[16]: 15
In [17]: td.nanoseconds
Out[17]: 500
构建一个TimedeltaIndex
In [18]: pd.TimedeltaIndex(['1 days', '1 days, 00:00:05',
....: np.timedelta64(2, 'D'),
....: datetime.timedelta(days=2, seconds=2)])
....:
Out[18]:
TimedeltaIndex(['1 days 00:00:00', '1 days 00:00:05', '2 days 00:00:00',
'2 days 00:00:02'],
dtype='timedelta64[ns]', freq=None)
构造一个TimedeltaIndex
具有规则范围的
In [19]: pd.timedelta_range('1 days', periods=5, freq='D')
Out[19]: TimedeltaIndex(['1 days', '2 days', '3 days', '4 days', '5 days'], dtype='timedelta64[ns]', freq='D')
In [20]: pd.timedelta_range(start='1 days', end='2 days', freq='30T')
Out[20]:
TimedeltaIndex(['1 days 00:00:00', '1 days 00:30:00', '1 days 01:00:00',
'1 days 01:30:00', '1 days 02:00:00', '1 days 02:30:00',
'1 days 03:00:00', '1 days 03:30:00', '1 days 04:00:00',
'1 days 04:30:00', '1 days 05:00:00', '1 days 05:30:00',
'1 days 06:00:00', '1 days 06:30:00', '1 days 07:00:00',
'1 days 07:30:00', '1 days 08:00:00', '1 days 08:30:00',
'1 days 09:00:00', '1 days 09:30:00', '1 days 10:00:00',
'1 days 10:30:00', '1 days 11:00:00', '1 days 11:30:00',
'1 days 12:00:00', '1 days 12:30:00', '1 days 13:00:00',
'1 days 13:30:00', '1 days 14:00:00', '1 days 14:30:00',
'1 days 15:00:00', '1 days 15:30:00', '1 days 16:00:00',
'1 days 16:30:00', '1 days 17:00:00', '1 days 17:30:00',
'1 days 18:00:00', '1 days 18:30:00', '1 days 19:00:00',
'1 days 19:30:00', '1 days 20:00:00', '1 days 20:30:00',
'1 days 21:00:00', '1 days 21:30:00', '1 days 22:00:00',
'1 days 22:30:00', '1 days 23:00:00', '1 days 23:30:00',
'2 days 00:00:00'],
dtype='timedelta64[ns]', freq='30T')
您现在可以使用 aTimedeltaIndex
作为 pandas 对象的索引
In [20]: s = pd.Series(np.arange(5),
....: index=pd.timedelta_range('1 days', periods=5, freq='s'))
....:
In [21]: s
Out[21]:
1 days 00:00:00 0
1 days 00:00:01 1
1 days 00:00:02 2
1 days 00:00:03 3
1 days 00:00:04 4
Freq: s, Length: 5, dtype: int64
您可以选择部分字符串选择
In [22]: s['1 day 00:00:02']
Out[22]: 2
In [23]: s['1 day':'1 day 00:00:02']
Out[23]:
1 days 00:00:00 0
1 days 00:00:01 1
1 days 00:00:02 2
Freq: s, Length: 3, dtype: int64
TimedeltaIndex
最后,与的组合DatetimeIndex
允许NaT
保留某些组合操作:
In [24]: tdi = pd.TimedeltaIndex(['1 days', pd.NaT, '2 days'])
In [25]: tdi.tolist()
Out[25]: [Timedelta('1 days 00:00:00'), NaT, Timedelta('2 days 00:00:00')]
In [26]: dti = pd.date_range('20130101', periods=3)
In [27]: dti.tolist()
Out[27]:
[Timestamp('2013-01-01 00:00:00'),
Timestamp('2013-01-02 00:00:00'),
Timestamp('2013-01-03 00:00:00')]
In [28]: (dti + tdi).tolist()
Out[28]: [Timestamp('2013-01-02 00:00:00'), NaT, Timestamp('2013-01-05 00:00:00')]
In [29]: (dti - tdi).tolist()
Out[29]: [Timestamp('2012-12-31 00:00:00'), NaT, Timestamp('2013-01-01 00:00:00')]
对每个元素返回 v0.15.0 之前的
Series
eg的迭代。这些现在将被包裹在.list(Series(...))
timedelta64[ns]
np.timedelta64
Timedelta
内存使用情况#
实现了查找 DataFrame 内存使用情况的方法。请参阅常见问题解答了解更多信息。 (GH 6852)。
新的显示选项display.memory_usage
(请参阅选项和设置memory_usage
)设置方法中参数的默认行为df.info()
。默认情况下display.memory_usage
是True
.
In [30]: dtypes = ['int64', 'float64', 'datetime64[ns]', 'timedelta64[ns]',
....: 'complex128', 'object', 'bool']
....:
In [31]: n = 5000
In [32]: data = {t: np.random.randint(100, size=n).astype(t) for t in dtypes}
In [33]: df = pd.DataFrame(data)
In [34]: df['categorical'] = df['object'].astype('category')
In [35]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5000 entries, 0 to 4999
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 int64 5000 non-null int64
1 float64 5000 non-null float64
2 datetime64[ns] 5000 non-null datetime64[ns]
3 timedelta64[ns] 5000 non-null timedelta64[ns]
4 complex128 5000 non-null complex128
5 object 5000 non-null object
6 bool 5000 non-null bool
7 categorical 5000 non-null category
dtypes: bool(1), category(1), complex128(1), datetime64[ns](1), float64(1), int64(1), object(1), timedelta64[ns](1)
memory usage: 288.2+ KB
此外,memory_usage()
数据框对象还有一个可用的方法,它返回每列的内存使用情况。
In [36]: df.memory_usage(index=True)
Out[36]:
Index 128
int64 40000
float64 40000
datetime64[ns] 40000
timedelta64[ns] 40000
complex128 80000
object 40000
bool 5000
categorical 9968
Length: 9, dtype: int64
Series.dt 访问器#
Series
已经获得了一个访问器,可以简洁地返回系列值的日期时间属性(如果它是像系列一样的日期时间/周期)。 ( GH 7207 ) 这将返回一个系列,其索引类似于现有系列。请参阅文档
# datetime
In [37]: s = pd.Series(pd.date_range('20130101 09:10:12', periods=4))
In [38]: s
Out[38]:
0 2013-01-01 09:10:12
1 2013-01-02 09:10:12
2 2013-01-03 09:10:12
3 2013-01-04 09:10:12
Length: 4, dtype: datetime64[ns]
In [39]: s.dt.hour
Out[39]:
0 9
1 9
2 9
3 9
Length: 4, dtype: int32
In [40]: s.dt.second
Out[40]:
0 12
1 12
2 12
3 12
Length: 4, dtype: int32
In [41]: s.dt.day
Out[41]:
0 1
1 2
2 3
3 4
Length: 4, dtype: int32
In [42]: s.dt.freq
Out[42]: 'D'
这可以实现像这样的漂亮表达式:
In [43]: s[s.dt.day == 2]
Out[43]:
1 2013-01-02 09:10:12
Length: 1, dtype: datetime64[ns]
您可以轻松地生成 tz 感知转换:
In [44]: stz = s.dt.tz_localize('US/Eastern')
In [45]: stz
Out[45]:
0 2013-01-01 09:10:12-05:00
1 2013-01-02 09:10:12-05:00
2 2013-01-03 09:10:12-05:00
3 2013-01-04 09:10:12-05:00
Length: 4, dtype: datetime64[ns, US/Eastern]
In [46]: stz.dt.tz
Out[46]: <DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>
您还可以链接这些类型的操作:
In [47]: s.dt.tz_localize('UTC').dt.tz_convert('US/Eastern')
Out[47]:
0 2013-01-01 04:10:12-05:00
1 2013-01-02 04:10:12-05:00
2 2013-01-03 04:10:12-05:00
3 2013-01-04 04:10:12-05:00
Length: 4, dtype: datetime64[ns, US/Eastern]
该.dt
访问器适用于 period 和 timedelta 数据类型。
# period
In [48]: s = pd.Series(pd.period_range('20130101', periods=4, freq='D'))
In [49]: s
Out[49]:
0 2013-01-01
1 2013-01-02
2 2013-01-03
3 2013-01-04
Length: 4, dtype: period[D]
In [50]: s.dt.year
Out[50]:
0 2013
1 2013
2 2013
3 2013
Length: 4, dtype: int64
In [51]: s.dt.day
Out[51]:
0 1
1 2
2 3
3 4
Length: 4, dtype: int64
# timedelta
In [52]: s = pd.Series(pd.timedelta_range('1 day 00:00:05', periods=4, freq='s'))
In [53]: s
Out[53]:
0 1 days 00:00:05
1 1 days 00:00:06
2 1 days 00:00:07
3 1 days 00:00:08
Length: 4, dtype: timedelta64[ns]
In [54]: s.dt.days
Out[54]:
0 1
1 1
2 1
3 1
Length: 4, dtype: int64
In [55]: s.dt.seconds
Out[55]:
0 5
1 6
2 7
3 8
Length: 4, dtype: int32
In [56]: s.dt.components
Out[56]:
days hours minutes seconds milliseconds microseconds nanoseconds
0 1 0 0 5 0 0 0
1 1 0 0 6 0 0 0
2 1 0 0 7 0 0 0
3 1 0 0 8 0 0 0
[4 rows x 7 columns]
时区处理改进#
tz_localize(None)
对于 tz 感知Timestamp
,DatetimeIndex
现在删除保存本地时间的时区,以前这会导致Exception
或TypeError
(GH 7812)In [58]: ts = pd.Timestamp('2014-08-01 09:00', tz='US/Eastern') In[59]: ts Out[59]: Timestamp('2014-08-01 09:00:00-0400', tz='US/Eastern') In [60]: ts.tz_localize(None) Out[60]: Timestamp('2014-08-01 09:00:00') In [61]: didx = pd.date_range(start='2014-08-01 09:00', freq='H', ....: periods=10, tz='US/Eastern') ....: In [62]: didx Out[62]: DatetimeIndex(['2014-08-01 09:00:00-04:00', '2014-08-01 10:00:00-04:00', '2014-08-01 11:00:00-04:00', '2014-08-01 12:00:00-04:00', '2014-08-01 13:00:00-04:00', '2014-08-01 14:00:00-04:00', '2014-08-01 15:00:00-04:00', '2014-08-01 16:00:00-04:00', '2014-08-01 17:00:00-04:00', '2014-08-01 18:00:00-04:00'], dtype='datetime64[ns, US/Eastern]', freq='H') In [63]: didx.tz_localize(None) Out[63]: DatetimeIndex(['2014-08-01 09:00:00', '2014-08-01 10:00:00', '2014-08-01 11:00:00', '2014-08-01 12:00:00', '2014-08-01 13:00:00', '2014-08-01 14:00:00', '2014-08-01 15:00:00', '2014-08-01 16:00:00', '2014-08-01 17:00:00', '2014-08-01 18:00:00'], dtype='datetime64[ns]', freq=None)
tz_localize
现在接受ambiguous
允许传递布尔数组的关键字,指示日期是否属于 DST,“NaT”用于将转换时间设置为 NaT,“infer”用于推断 DST/非 DST,以及“raise”(默认)以便AmbiguousTimeError
筹集资金。有关更多详细信息,请参阅文档( GH 7943)DataFrame.tz_localize
现在DataFrame.tz_convert
接受一个可选level
参数来本地化 MultiIndex 的特定级别 ( GH 7846 )Timestamp.tz_localize
现在在错误情况下Timestamp.tz_convert
引发TypeError
,而不是Exception
(GH 8025)当插入到 Series/DataFrame 中时,本地化为 UTC 的时间序列/索引将保留 UTC 时区(而不是天真的
datetime64[ns]
)作为object
dtype ( GH 8411 )Timestamp.__repr__
显示dateutil.tz.tzoffset
信息(GH 7907)
滚动/扩展力矩改进#
rolling_min()
、rolling_max()
、rolling_cov()
、rolling_corr()
现在使用 allNaN
when而不是 raise 返回对象。 (这使得所有滚动函数在此行为中保持一致)。 (GH 7766)len(arg) < min_periods <= window
0.15.0 之前
In [57]: s = pd.Series([10, 11, 12, 13])
In [15]: pd.rolling_min(s, window=10, min_periods=5) ValueError: min_periods (5) must be <= window (4)
新行为
In [4]: pd.rolling_min(s, window=10, min_periods=5) Out[4]: 0 NaN 1 NaN 2 NaN 3 NaN dtype: float64
rolling_max()
,rolling_min()
,rolling_sum()
,rolling_mean()
,rolling_median()
,rolling_std()
,rolling_var()
, ,rolling_skew()
,rolling_kurt()
,rolling_quantile()
,rolling_cov()
,rolling_corr()
,rolling_corr_pairwise()
,rolling_window()
和rolling_apply()
with之前将返回与最终条目中的输入withcenter=True
相同结构的结果。arg
NaN
(window-1)/2
(window-1)/2
现在,计算结果的最终条目就好像输入后面arg
跟着(window-1)/2
NaN
值(或者在 的情况下缩小窗口rolling_apply()
)。 (GH 7925,GH 8269)先前的行为(注意最终值为
NaN
):In [7]: pd.rolling_sum(Series(range(4)), window=3, min_periods=0, center=True) Out[7]: 0 1 1 3 2 6 3 NaN dtype: float64
新行为(注意最终值为):
5 = sum([2, 3, NaN])
In [7]: pd.rolling_sum(pd.Series(range(4)), window=3, ....: min_periods=0, center=True) Out[7]: 0 1 1 3 2 6 3 5 dtype: float64
rolling_window()
现在以滚动平均模式( mean=True )正确标准化权重,以便计算出的加权平均值(例如“三角”、“高斯”)的分布与未加权计算的平均值(即“boxcar”)大致相同。有关更多详细信息,请参阅标准化注释。 (GH 7618)In [58]: s = pd.Series([10.5, 8.8, 11.4, 9.7, 9.3])
0.15.0 之前的行为:
In [39]: pd.rolling_window(s, window=3, win_type='triang', center=True) Out[39]: 0 NaN 1 6.583333 2 6.883333 3 6.683333 4 NaN dtype: float64
新行为
In [10]: pd.rolling_window(s, window=3, win_type='triang', center=True) Out[10]: 0 NaN 1 9.875 2 10.325 3 10.025 4 NaN dtype: float64
center
从所有expanding_
函数中删除了参数(参见list),因为 when 产生的结果center=True
没有多大意义。 (GH 7925)ddof
向expanding_cov()
和添加了可选参数rolling_cov()
。的默认值1
是向后兼容的。 ( GH 8279 )记录了、、 和 的
ddof
论点。这些函数对参数(默认值为)的支持 以前没有记录。 (GH 8064)expanding_var()
expanding_std()
rolling_var()
rolling_std()
ddof
1
ewma()
、ewmstd()
、ewmvol()
、ewmvar()
、ewmcov()
和现在以与和函数相同的方式ewmcorr()
解释:如果(在本例中为扩展)窗口不包含至少值,则给定结果条目将是。以前的行为是设置为以第一个非值开始的条目。 (GH 7977)min_periods
rolling_*()
expanding_*()
NaN
min_periods
NaN
min_periods
NaN
先前的行为(注意值从index开始
2
,它min_periods
位于index0
(第一个非空值的索引)之后):In [59]: s = pd.Series([1, None, None, None, 2, 3])
In [51]: pd.ewma(s, com=3., min_periods=2) Out[51]: 0 NaN 1 NaN 2 1.000000 3 1.000000 4 1.571429 5 2.189189 dtype: float64
新行为(注意值从 index 开始,即第二个(自)非空值
4
的位置):min_periods=2
In [2]: pd.ewma(s, com=3., min_periods=2) Out[2]: 0 NaN 1 NaN 2 NaN 3 NaN 4 1.759644 5 2.383784 dtype: float64
ewmstd()
、ewmvol()
、ewmvar()
、ewmcov()
、ewmcorr()
现在有一个可选adjust
参数,就像ewma()
它一样,影响权重的计算方式。adjust
的默认值为True
,它是向后兼容的。有关详细信息,请参阅指数加权矩函数。 (GH 7911)ewma()
、ewmstd()
、ewmvol()
、ewmvar()
、ewmcov()
、ewmcorr()
现在有一个可选ignore_na
参数。当ignore_na=False
(默认)时,权重计算中会考虑缺失值。当ignore_na=True
(再现 0.15.0 之前的行为)时,权重计算中将忽略缺失值。 (GH 7543)In [7]: pd.ewma(pd.Series([None, 1., 8.]), com=2.) Out[7]: 0 NaN 1 1.0 2 5.2 dtype: float64 In [8]: pd.ewma(pd.Series([1., None, 8.]), com=2., ....: ignore_na=True) # pre-0.15.0 behavior Out[8]: 0 1.0 1 1.0 2 5.2 dtype: float64 In [9]: pd.ewma(pd.Series([1., None, 8.]), com=2., ....: ignore_na=False) # new default Out[9]: 0 1.000000 1 1.000000 2 5.846154 dtype: float64
警告
默认情况下 (
ignore_na=False
),ewm*()
存在缺失值时函数的权重计算与 0.15.0 之前的版本不同。要在存在缺失值的情况下重现 0.15.0 之前的权重计算,必须明确指定ignore_na=True
。expanding_cov()
、expanding_corr()
、rolling_cov()
、rolling_cor()
、中的错误ewmcov()
,以及ewmcorr()
返回按名称排序的列的结果并对非唯一列产生错误;现在处理非唯一列并按原始顺序返回列(两个 DataFrame 的情况除外pairwise=False
,其中行为不变)(GH 7542)错误
rolling_count()
和expanding_*()
函数不必要地为零长度数据产生错误消息(GH 8056)错误
rolling_apply()
并expanding_apply()
解释min_periods=0
为min_periods=1
(GH 8080)单个值中的错误会产生令人困惑的错误消息
expanding_std()
(GH 7900)expanding_var()
Bug in
rolling_std()
和rolling_var()
for a single value generated0
而不是NaN
( GH 7900 )ewmstd()
、ewmvol()
、ewmvar()
和ewmcov()
计算go偏因子时出现错误bias=False
(默认)。以前,基于adjust=True
、ignore_na=True
和无限数量的观察,使用了不正确的常数因子。现在,根据实际权重(类似于通常的N/(N-1)
因子),每个条目使用不同的因子。特别是,对于单个点,NaN
当 时返回的值,而之前返回bias=False
(大约)的值。0
例如,考虑以下 0.15.0 之前的结果,以及相应的go偏因子:
ewmvar(..., bias=False)
In [60]: s = pd.Series([1., 2., 0., 4.])
In [89]: pd.ewmvar(s, com=2., bias=False) Out[89]: 0 -2.775558e-16 1 3.000000e-01 2 9.556787e-01 3 3.585799e+00 dtype: float64 In [90]: pd.ewmvar(s, com=2., bias=False) / pd.ewmvar(s, com=2., bias=True) Out[90]: 0 1.25 1 1.25 2 1.25 3 1.25 dtype: float64
请注意,输入值
0
大约为 0,并且go偏因子为常数 1.25。相比之下,以下 0.15.0 结果的NaN
输入为0
,并且go偏因子正在减小(朝向 1.25):In [14]: pd.ewmvar(s, com=2., bias=False) Out[14]: 0 NaN 1 0.500000 2 1.210526 3 4.089069 dtype: float64 In [15]: pd.ewmvar(s, com=2., bias=False) / pd.ewmvar(s, com=2., bias=True) Out[15]: 0 NaN 1 2.083333 2 1.583333 3 1.425439 dtype: float64
SQL IO 模块的改进#
chunksize
添加了对函数参数的支持to_sql
。这允许 DataFrame 以块的形式写入并避免数据包大小溢出错误(GH 8062)。chunksize
添加了对函数参数的支持read_sql
。指定此参数将返回一个遍历查询结果块的迭代器(GH 2908)。添加了对(GH 6932 )写入
datetime.date
和datetime.time
对象列的支持。to_sql
添加了对使用and ( GH 7441、GH 7952 )指定
schema
读取/写入的支持。例如:read_sql_table
to_sql
df.to_sql('table', engine, schema='other_schema') # noqa F821 pd.read_sql_table('table', engine, schema='other_schema') # noqa F821
添加了对使用( GH 2754
NaN
) 写入值的支持。to_sql
to_sql
添加了对所有数据库风格 ( GH 7103 )写入 datetime64 列的支持。
向后不兼容的 API 更改#
重大变更#
相关 API 更改Categorical
(请参阅此处
了解更多详细信息):
具有两个参数的构造
Categorical
函数从“代码/标签和级别”更改为“值和级别(现在称为“类别”)”。这可能会导致微妙的错误。如果您Categorical
直接使用,请通过将其更改为使用from_codes()
构造函数来审核您的代码。旧的函数调用如(0.15.0 之前):
pd.Categorical([0,1,0,2,1], levels=['a', 'b', 'c'])
必须适应以下内容才能保持相同的行为:
In [2]: pd.Categorical.from_codes([0,1,0,2,1], categories=['a', 'b', 'c']) Out[2]: [a, b, a, c, b] Categories (3, object): [a, b, c]
与标量的引入相关的 API 更改Timedelta
(
更多详细信息请参见上文):
在 0.15.0 之前,将为类列表/系列输入
to_timedelta()
返回一个,为标量输入返回一个。现在,它将为类似列表的输入、系列输入和标量输入返回一个。Series
np.timedelta64
TimedeltaIndex
Series
Timedelta
有关滚动和扩展功能相关的 API 更改,请参阅上面的详细概述。
其他值得注意的 API 更改:
.loc
当未找到任何值时,使用类似列表的索引器进行索引时的一致性。In [61]: df = pd.DataFrame([['a'], ['b']], index=[1, 2]) In [62]: df Out[62]: 0 1 a 2 b [2 rows x 1 columns]
在之前的版本中,这两个结构存在差异:
df.loc[[3]]
将返回一个重新索引为 3 的帧(包含所有np.nan
值)df.loc[[3],:]
会提高KeyError
。
双方现在都将提出
KeyError
.规则是使用类似列表的 and 时必须至少找到 1 个.loc
索引器( GH 7999 )此外,在之前的版本中,这些也有所不同:
df.loc[[1,3]]
将返回由 [1,3] 重新索引的帧df.loc[[1,3],:]
会提高KeyError
。
现在两者都将返回帧重新索引[1,3]。例如
In [3]: df.loc[[1, 3]] Out[3]: 0 1 a 3 NaN In [4]: df.loc[[1, 3], :] Out[4]: 0 1 a 3 NaN
这也可以在带有 的多轴索引中看到
Panel
。>>> p = pd.Panel(np.arange(2 * 3 * 4).reshape(2, 3, 4), ... items=['ItemA', 'ItemB'], ... major_axis=[1, 2, 3], ... minor_axis=['A', 'B', 'C', 'D']) >>> p <class 'pandas.core.panel.Panel'> Dimensions: 2 (items) x 3 (major_axis) x 4 (minor_axis) Items axis: ItemA to ItemB Major_axis axis: 1 to 3 Minor_axis axis: A to D
KeyError
在 0.15.0 之前会引发以下问题:In [5]: Out[5]: ItemA ItemD 1 3 NaN 2 7 NaN 3 11 NaN
此外,
.loc
如果在具有类似列表的索引器的 MultiIndex 中找不到值,则会引发:In [63]: s = pd.Series(np.arange(3, dtype='int64'), ....: index=pd.MultiIndex.from_product([['A'], ....: ['foo', 'bar', 'baz']], ....: names=['one', 'two']) ....: ).sort_index() ....: In [64]: s Out[64]: one two A bar 1 baz 2 foo 0 Length: 3, dtype: int64 In [65]: try: ....: s.loc[['D']] ....: except KeyError as e: ....: print("KeyError: " + str(e)) ....: KeyError: "['D'] not in index"
None
现在,在选择“空”值(GH 7941)时,分配值会考虑数据类型。以前,在数字容器中分配给
None
将数据类型更改为对象(或出错,具体取决于调用)。它现在使用NaN
:In [66]: s = pd.Series([1., 2., 3.]) In [67]: s.loc[0] = None In [68]: s Out[68]: 0 NaN 1 2.0 2 3.0 Length: 3, dtype: float64
NaT
现在类似地用于日期时间容器。对于对象容器,我们现在保留
None
值(以前这些值被转换为NaN
值)。In [69]: s = pd.Series(["a", "b", "c"]) In [70]: s.loc[0] = None In [71]: s Out[71]: 0 None 1 b 2 c Length: 3, dtype: object
要插入
NaN
,您必须显式使用np.nan
.请参阅文档。在以前的版本中,就地更新 pandas 对象不会反映在对此对象的其他 python 引用中。 (GH 8511,GH 5104)
In [72]: s = pd.Series([1, 2, 3]) In [73]: s2 = s In [74]: s += 1.5
v0.15.0 之前的行为
# the original object In [5]: s Out[5]: 0 2.5 1 3.5 2 4.5 dtype: float64 # a reference to the original object In [7]: s2 Out[7]: 0 1 1 2 2 3 dtype: int64
现在这是正确的行为
# the original object In [75]: s Out[75]: 0 2.5 1 3.5 2 4.5 Length: 3, dtype: float64 # a reference to the original object In [76]: s2 Out[76]: 0 2.5 1 3.5 2 4.5 Length: 3, dtype: float64
制作基于 C 和 Python 的引擎,
read_csv
并read_table
忽略输入中的空行以及空白填充的行,只要sep
不是空白即可。这是一个 API 更改,可以通过关键字参数来控制skip_blank_lines
。请参阅文档(GH 4466)当插入到 Series/DataFrame 中时,本地化为 UTC 的时间序列/索引将保留 UTC 时区并作为
object
dtype 插入,而不是转换为简单的datetime64[ns]
( GH 8411 )。传递
DatetimeIndex
带有时区的错误,该时区未保留在字典的 DataFrame 构造中(GH 7822)在以前的版本中,这会删除时区,现在它保留时区,但给出一列 dtype
object
:In [77]: i = pd.date_range('1/1/2011', periods=3, freq='10s', tz='US/Eastern') In [78]: i Out[78]: DatetimeIndex(['2011-01-01 00:00:00-05:00', '2011-01-01 00:00:10-05:00', '2011-01-01 00:00:20-05:00'], dtype='datetime64[ns, US/Eastern]', freq='10s') In [79]: df = pd.DataFrame({'a': i}) In [80]: df Out[80]: a 0 2011-01-01 00:00:00-05:00 1 2011-01-01 00:00:10-05:00 2 2011-01-01 00:00:20-05:00 [3 rows x 1 columns] In [81]: df.dtypes Out[81]: a datetime64[ns, US/Eastern] Length: 1, dtype: object
以前,这会生成一列
datetime64
dtype,但没有时区信息。将列分配给现有数据帧的行为 保持不变(这已经返回带有时区的列)。
df['a'] = i
object
当将多个级别传递给 时,如果级别不是所有级别名称或所有级别编号(GH 7660),
stack()
它现在会引发 a 。请参阅 通过堆叠和取消堆叠重塑形状。ValueError
如果具有非唯一列,则使用“固定”格式提出 a,
ValueError
因为生成的文件将被破坏(GH 7761)df.to_hdf
df
SettingWithCopy
mode.chained_assignment
现在,当使用链式赋值在切片混合数据类型 DataFrame 上设置值时,将发出引发/警告(根据选项)。 (GH 7845,GH 7950)In [1]: df = pd.DataFrame(np.arange(0, 9), columns=['count']) In [2]: df['group'] = 'b' In [3]: df.iloc[0:5]['group'] = 'a' /usr/local/bin/ipython:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
merge
、DataFrame.merge
、ordered_merge
现在返回与参数相同的类型left
(GH 7737)。以前,使用混合 dtype 框架的放大效果与
.append
保留 dtypes 不同(相关GH 2578、GH 8176):In [82]: df = pd.DataFrame([[True, 1], [False, 2]], ....: columns=["female", "fitness"]) ....: In [83]: df Out[83]: female fitness 0 True 1 1 False 2 [2 rows x 2 columns] In [84]: df.dtypes Out[84]: female bool fitness int64 Length: 2, dtype: object # dtypes are now preserved In [85]: df.loc[2] = df.loc[1] In [86]: df Out[86]: female fitness 0 True 1 1 False 2 2 False 2 [3 rows x 2 columns] In [87]: df.dtypes Out[87]: female bool fitness int64 Length: 2, dtype: object
Series.to_csv()
现在返回一个字符串 when ,匹配( GH 8215path=None
)的行为。DataFrame.to_csv()
read_hdf
现在,IOError
当传入不存在的文件时会引发该问题。以前,创建了一个新的空文件,并KeyError
引发了一个问题 ( GH 7715 )。DataFrame.info()
现在以换行符结束其输出(GH 8114)现在,连接任何对象都不会引发 a
ValueError
而不是 bareException
。合并错误现在将是子类
ValueError
而不是原始错误Exception
(GH 8501)DataFrame.plot
并且Series.plot
关键字现在具有一致的顺序(GH 8037)
内部重构#
在 0.15.0 中Index
,内部已被重构为不再是 subclassndarray
而是 subclass PandasObject
,类似于 pandas 对象的其余部分。此更改允许非常轻松地子分类和创建新索引类型。这应该是一个透明的更改,只有非常有限的 API 影响(GH 5080、GH 7439、GH 7796、GH 8024、GH 8367、GH 7997、GH 8522):
弃用#
属性
Categorical
labels
和levels
attribute 已弃用并重命名为codes
和categories
。outtype
的参数已pd.DataFrame.to_dict
被弃用,取而代之的是orient
。 (GH 7840)该
convert_dummies
方法已被弃用,取而代之的是get_dummies
(GH 8140)infer_dst
中的参数将tz_localize
被弃用,以ambiguous
允许在处理 DST 转换时具有更大的灵活性。替换infer_dst=True
为ambiguous='infer'
具有相同的行为(GH 7943)。请参阅文档了解更多详细信息。顶层
pd.value_range
已被弃用,可以替换为.describe()
(GH 8481)
Index
不推荐使用set 操作和+
,-
以便为某些索引类型上的数字类型操作提供这些操作。+
可以用.union()
或|
、 和-
代替.difference()
。此外,方法名称Index.diff()
已被弃用,可以替换为Index.difference()
(GH 8226)# + pd.Index(['a', 'b', 'c']) + pd.Index(['b', 'c', 'd']) # should be replaced by pd.Index(['a', 'b', 'c']).union(pd.Index(['b', 'c', 'd']))
# - pd.Index(['a', 'b', 'c']) - pd.Index(['b', 'c', 'd']) # should be replaced by pd.Index(['a', 'b', 'c']).difference(pd.Index(['b', 'c', 'd']))
infer_types
到 now 的参数无效read_html()
并已弃用(GH 7762、GH 7032)。
删除先前版本的弃用/更改#
删除
DataFrame.delevel
方法有利于DataFrame.reset_index
增强功能#
Stata 文件导入/导出方面的增强功能:
添加了对 bool、uint8、uint16 和 uint32 数据类型的支持
to_stata
(GH 7097、GH 7365)导入 Stata 文件时添加转换选项(GH 8527)
DataFrame.to_stata
并StataWriter
检查字符串长度是否与 dta 文件中施加的限制兼容,其中固定宽度字符串必须包含 244 个或更少的字符。尝试写入字符串长度超过 244 个字符的 Stata dta 文件会引发ValueError
. (GH 7858)read_stata
并且可以通过将参数设置为来StataReader
将丢失的数据信息导入到 a 中 。使用此选项时,缺失值将作为 包含缺失值的对象和列具有数据类型而返回。 ( GH 8045 )DataFrame
convert_missing
True
StataMissingValue
object
绘图功能的增强:
添加
layout
关键字到DataFrame.plot
.您可以传递一个元组,其中一个可以自动推断(GH 6667,GH 8071)。(rows, columns)
-1
允许将多个轴传递给
DataFrame.plot
,hist
和boxplot
( GH 5353 , GH 6970 , GH 7069 )添加了对和
c
with的支持( GH 7780 )colormap
colorbar
DataFrame.plot
kind='scatter'
其他:
read_csv
现在有一个关键字参数float_precision
,它指定 C 引擎在解析期间应使用哪个浮点转换器,请参见此处(GH 8002、GH 8044)向对象添加了
searchsorted
方法Series
(GH 7447)describe()
在混合类型 DataFrame 上更加灵活。现在可以通过include
/exclude
参数进行基于类型的列过滤。请参阅文档(GH 8164)。In [88]: df = pd.DataFrame({'catA': ['foo', 'foo', 'bar'] * 8, ....: 'catB': ['a', 'b', 'c', 'd'] * 6, ....: 'numC': np.arange(24), ....: 'numD': np.arange(24.) + .5}) ....: In [89]: df.describe(include=["object"]) Out[89]: catA catB count 24 24 unique 2 4 top foo a freq 16 6 [4 rows x 2 columns] In [90]: df.describe(include=["number", "object"], exclude=["float"]) Out[90]: catA catB numC count 24 24 24.000000 unique 2 4 NaN top foo a NaN freq 16 6 NaN mean NaN NaN 11.500000 std NaN NaN 7.071068 min NaN NaN 0.000000 25% NaN NaN 5.750000 50% NaN NaN 11.500000 75% NaN NaN 17.250000 max NaN NaN 23.000000 [11 rows x 3 columns]
可以使用简写“all”请求所有列
In [91]: df.describe(include='all') Out[91]: catA catB numC numD count 24 24 24.000000 24.000000 unique 2 4 NaN NaN top foo a NaN NaN freq 16 6 NaN NaN mean NaN NaN 11.500000 12.000000 std NaN NaN 7.071068 7.071068 min NaN NaN 0.000000 0.500000 25% NaN NaN 5.750000 6.250000 50% NaN NaN 11.500000 12.000000 75% NaN NaN 17.250000 17.750000 max NaN NaN 23.000000 23.500000 [11 rows x 4 columns]
如果没有这些参数,
describe
将像以前一样运行,仅包括数字列,或者如果没有,则仅包括分类列。另请参阅文档split
作为选项添加到orient
中的参数中pd.DataFrame.to_dict
。 (GH 7840)该
get_dummies
方法现在可以在 DataFrame 上使用。默认情况下,只有分类列被编码为 0 和 1,而其他列保持不变。In [92]: df = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': ['c', 'c', 'b'], ....: 'C': [1, 2, 3]}) ....: In [93]: pd.get_dummies(df) Out[93]: C A_a A_b B_b B_c 0 1 True False False True 1 2 False True False True 2 3 True False True False [3 rows x 5 columns]
PeriodIndex
支持与(GH 7708)resolution
相同DatetimeIndex
pandas.tseries.holiday
增加了对额外假期和观察假期的方式的支持(GH 7070)pandas.tseries.holiday.Holiday
现在支持 Python3 中的偏移量列表 ( GH 7070 )pandas.tseries.holiday.Holiday
现在支持 days_of_week 参数 ( GH 7070 )GroupBy.nth()
现在支持选择多个第 n 个值 ( GH 7910 )In [94]: business_dates = pd.date_range(start='4/1/2014', end='6/30/2014', freq='B') In [95]: df = pd.DataFrame(1, index=business_dates, columns=['a', 'b']) # get the first, 4th, and last date index for each month In [96]: df.groupby([df.index.year, df.index.month]).nth([0, 3, -1]) Out[96]: a b 2014-04-01 1 1 2014-04-04 1 1 2014-04-30 1 1 2014-05-01 1 1 2014-05-06 1 1 2014-05-30 1 1 2014-06-02 1 1 2014-06-05 1 1 2014-06-30 1 1 [9 rows x 2 columns]
Period
并PeriodIndex
支持加法/减法timedelta
-likes ( GH 7966 )如果
Period
freq 是D
,H
,T
,S
, ,L
,U
,N
,Timedelta
如果结果可以具有相同的频率,则可以添加类似的操作。否则,offsets
只能添加相同的内容。In [104]: idx = pd.period_range('2014-07-01 09:00', periods=5, freq='H') In [105]: idx Out[105]: PeriodIndex(['2014-07-01 09:00', '2014-07-01 10:00', '2014-07-01 11:00', '2014-07-01 12:00', '2014-07-01 13:00'], dtype='period[H]') In [106]: idx + pd.offsets.Hour(2) Out[106]: PeriodIndex(['2014-07-01 11:00', '2014-07-01 12:00', '2014-07-01 13:00', '2014-07-01 14:00', '2014-07-01 15:00'], dtype='period[H]') In [107]: idx + pd.Timedelta('120m') Out[107]: PeriodIndex(['2014-07-01 11:00', '2014-07-01 12:00', '2014-07-01 13:00', '2014-07-01 14:00', '2014-07-01 15:00'], dtype='period[H]') In [108]: idx = pd.period_range('2014-07', periods=5, freq='M') In [109]: idx Out[109]: PeriodIndex(['2014-07', '2014-08', '2014-09', '2014-10', '2014-11'], dtype='period[M]') In [110]: idx + pd.offsets.MonthEnd(3) Out[110]: PeriodIndex(['2014-10', '2014-11', '2014-12', '2015-01', '2015-02'], dtype='period[M]')
openpyxl
添加了与>= 2.0 版本的实验兼容性。 method关键字现在可以识别和 , 它将分别明确要求 openpyxl v1 和 v2,如果请求的版本不可用,则会失败DataFrame.to_excel
。该引擎现在是一个元引擎,它自动使用安装的 openpyxl 版本。 (GH 7177)engine
openpyxl1
openpyxl2
openpyxl
DataFrame.fillna
现在可以接受 aDataFrame
作为填充值 ( GH 8377 )stack()
现在,当传递多个级别编号时,传递多个级别将起作用( GH 7660)。请参阅 通过堆叠和取消堆叠重塑形状。set_names()
、set_labels()
和set_levels()
方法现在采用可选level
关键字参数来对 MultiIndex 的特定级别进行所有修改。此外,现在在 a或 a 的特定级别set_names()
上操作时接受标量字符串值( GH 7792 )Index
MultiIndex
In [97]: idx = pd.MultiIndex.from_product([['a'], range(3), list("pqr")], ....: names=['foo', 'bar', 'baz']) ....: In [98]: idx.set_names('qux', level=0) Out[98]: MultiIndex([('a', 0, 'p'), ('a', 0, 'q'), ('a', 0, 'r'), ('a', 1, 'p'), ('a', 1, 'q'), ('a', 1, 'r'), ('a', 2, 'p'), ('a', 2, 'q'), ('a', 2, 'r')], names=['qux', 'bar', 'baz']) In [99]: idx.set_names(['qux', 'corge'], level=[0, 1]) Out[99]: MultiIndex([('a', 0, 'p'), ('a', 0, 'q'), ('a', 0, 'r'), ('a', 1, 'p'), ('a', 1, 'q'), ('a', 1, 'r'), ('a', 2, 'p'), ('a', 2, 'q'), ('a', 2, 'r')], names=['qux', 'corge', 'baz']) In [100]: idx.set_levels(['a', 'b', 'c'], level='bar') Out[100]: MultiIndex([('a', 'a', 'p'), ('a', 'a', 'q'), ('a', 'a', 'r'), ('a', 'b', 'p'), ('a', 'b', 'q'), ('a', 'b', 'r'), ('a', 'c', 'p'), ('a', 'c', 'q'), ('a', 'c', 'r')], names=['foo', 'bar', 'baz']) In [101]: idx.set_levels([['a', 'b', 'c'], [1, 2, 3]], level=[1, 2]) Out[101]: MultiIndex([('a', 'a', 1), ('a', 'a', 2), ('a', 'a', 3), ('a', 'b', 1), ('a', 'b', 2), ('a', 'b', 3), ('a', 'c', 1), ('a', 'c', 2), ('a', 'c', 3)], names=['foo', 'bar', 'baz'])
Index.isin
现在支持一个level
参数来指定用于成员资格测试的索引级别(GH 7892,GH 7890)In [1]: idx = pd.MultiIndex.from_product([[0, 1], ['a', 'b', 'c']]) In [2]: idx.values Out[2]: array([(0, 'a'), (0, 'b'), (0, 'c'), (1, 'a'), (1, 'b'), (1, 'c')], dtype=object) In [3]: idx.isin(['a', 'c', 'e'], level=1) Out[3]: array([ True, False, True, True, False, True], dtype=bool)
Index
现在支持duplicated
和drop_duplicates
。 (GH 4060)In [102]: idx = pd.Index([1, 2, 3, 4, 1, 2]) In [103]: idx Out[103]: Index([1, 2, 3, 4, 1, 2], dtype='int64') In [104]: idx.duplicated() Out[104]: array([False, False, False, False, True, True]) In [105]: idx.drop_duplicates() Out[105]: Index([1, 2, 3, 4], dtype='int64')
添加
copy=True
参数以pd.concat
启用完整块的传递(GH 8252)添加了对 numpy 1.8+ 数据类型 (
bool_
,int_
,float_
,string_
) 的支持,以转换为 R 数据帧 ( GH 8400 )
表现#
性能改进以
DatetimeIndex.__iter__
允许更快的迭代(GH 7683)Period
创建(和PeriodIndex
setitem)方面的性能改进( GH 5155)Series.transform 的改进可显着提高性能(修订)(GH 6496)
StataWriter
写入大文件时的性能改进( GH 8079)多键性能和内存使用改进
groupby
(GH 8128)groupby 的性能改进
.agg
以及.apply
内置 max/min 未映射到 numpy/cythonized 版本(GH 7722)写入 sql (
to_sql
) 的性能提升高达 50% ( GH 8208 )。大值 ngroup 的 groupby 性能基准测试(GH 6787)
性能改进
CustomBusinessDay
,CustomBusinessMonth
( GH 8236 )MultiIndex.values
包含日期时间的多级索引的性能改进( GH 8543)
Bug修复#
使用边距和 dict aggfunc 时,pivot_table 中的错误(GH 8349)
返回视图的
read_csv
位置错误( GH 8217)squeeze=True
read_sql
在某些情况下检查表名称时出现错误( GH 7826)。指定频率时,
DataFrame.groupby
where无法识别级别的错误( GH 7885 )Grouper
当 DataFrame 保存到 SQL 表时,多索引 dtypes 中的错误会混淆(GH 8021)
Series
具有浮点和整数操作数数据类型的 0 除法中的错误( GH 7785 )Series.astype("unicode")
未unicode
正确调用值的错误( GH 7758)DataFrame.as_matrix()
混合datetime64[ns]
和数据类型的错误timedelta64[ns]
(GH 7778)HDFStore.select_column()
选择DatetimeIndex
( GH 7777 )时不保留 UTC 时区信息的错误指定和
to_datetime
时出现的错误,之前返回了一个对象数组(而不是带有 的强制时间序列),(GH 7930)format='%Y%m%d'
coerce=True
NaT
错误
DatetimeIndex
和PeriodIndex
就地加法和减法导致与正常结果不同(GH 6527)加法和减法
PeriodIndex
中的错误(GH 7741)PeriodIndex
TypeError
数据引发
combine_first
错误(GH 3367)PeriodIndex
TypeError
缺少索引器的多索引切片中的错误(GH 7866)
具有各种边缘情况的多索引切片中的错误(GH 8132)
使用非标量类型对象的 MultiIndex 索引回归 ( GH 7914 )
Timestamp
与 dtype 比较时==
出现错误int64
( GH 8058 )当内部引用属性时,泡菜包含中的错误
DateOffset
可能会引发( GH 7748)AttributeError
normalize
Panel
使用major_xs
和时出现错误copy=False
(由于缺少 ,弃用警告失败warnings
)(GH 8152)。pickle 反序列化中的错误,对于 0.14.1 之前的容器,在匹配块和管理器项目时,带有重复项的容器试图避免歧义,而当只有一个块时,则没有歧义(GH 7794)
PeriodIndex
将 a放入 a 中的错误Series
会转换为int64
dtype,而不是object
(Periods
GH 7932 )HDFStore
传递 where 时迭代中的错误( GH 8014)DataFrameGroupby.transform
使用传递的未排序密钥(GH 8046、GH 8430)进行转换时出现错误重复时间序列线和面积图中的错误可能会导致
ValueError
类型错误(GH 7733)MultiIndex
带输入的推理中的错误datetime.date
(GH 7888)错误,
get
其中 anIndexError
不会导致返回默认值(GH 7725)错误
offsets.apply
,rollforward
并rollback
可能重置纳秒(GH 7697)错误
offsets.apply
,如果有tzinforollforward
可能rollback
会引发错误(GH 7697)AttributeError
Timestamp
dateutil
Float64Index
使用( GH 8017 )对 MultiIndex 帧进行排序时出现错误面板 setitem 中的错误与 a 的 rhs
DataFrame
进行对齐(GH 7763)错误
is_superperiod
且is_subperiod
无法处理比S
(GH 7760、GH 7772、GH 7803)更高的频率32 位平台中的错误
Series.shift
( GH 8129 )PeriodIndex.unique
返回 int64中的错误np.ndarray
(GH 7540)groupby.apply
函数中存在非影响性突变( GH 8467)DataFrame.reset_index
其中包含MultiIndex
或PeriodIndex
与DatetimeIndex
tz 引发的错误ValueError
(GH 7746,GH 7793)错误
DataFrame.plot
可能subplots=True
会绘制不必要的小 xticks 和 yticks ( GH 7801 )StataReader
由于 Stata 文档和实现之间的差异,未读取 117 个文件中的变量标签的错误( GH 7816 )StataReader
无论底层字符串大小如何,字符串始终转换为 244 个字符固定宽度的错误( GH 7858 )错误
DataFrame.plot
可能Series.plot
会忽略rot
andfontsize
关键字(GH 7844)Bug
DatetimeIndex.value_counts
不保留 tz ( GH 7735 )PeriodIndex.value_counts
结果中的错误Int64Index
( GH 7735 )DataFrame.join
在索引上进行左连接并且有多个匹配项时出现错误( GH 5391)GroupBy.transform()
具有未保留索引的转换的 int 组被错误截断的错误( GH 7972 )。groupby
没有名称属性的可调用对象会采用错误的路径,并生成 aDataFrame
而不是 a 的错误(Series
GH 7929)groupby
当 DataFrame 分组列重复时错误消息中的错误( GH 7511 )索引错误
Series.str.cat
,该索引被过滤为不包含第一项(GH 7857)错误无法从字符串
Timestamp
解析( GH 7878)nanosecond
字符串
Timestamp
偏移量错误且tz
结果不正确(GH 7833)错误
tslib.tz_convert
并tslib.tz_convert_single
可能返回不同的结果(GH 7798)DatetimeIndex.intersection
与 tz 提升的非重叠时间戳相关的错误IndexError
( GH 7880 )与 TimeOps 和非唯一索引一致的错误 ( GH 8363 )
快速路径与慢速路径的错误
GroupBy.filter()
使过滤器返回一个看似有效但实际上无效的非标量值(GH 7870)。从输入日期推断时区但在跨越 DST 边界( GH 7835 、 GH 7901 )时返回
date_range()
错误时间时出现错误。DatetimeIndex()
错误在于
to_excel()
负号被添加到正无穷大并且负无穷大不存在(GH 7949)面积图中的错误绘制图例的
alpha
时间不正确stacked=True
(GH 8027)Period
和PeriodIndex
加法/减法导致np.timedelta64
不正确的内部表示(GH 7740)Holiday
没有偏移或遵守的错误( GH 7987)DataFrame.to_latex
当列或索引为MultiIndex
( GH 7982 ) 时格式错误。DateOffset
夏令时周围的错误会产生意想不到的结果( GH 5175)。DataFrame.shift
numpy 1.7上空列抛出的错误ZeroDivisionError
(GH 8019)安装中
html_encoding/*.html
未安装的错误,因此某些测试未正确运行(GH 7927)。未测试对象的
read_html
错误(GH 7927)。bytes
_read
DataFrame.stack()
当其中一个列级别为日期类型时出现错误( GH 8039)DataFrame
使用(GH 8116)广播 numpy 标量时出现错误pivot_table
使用无名执行错误index
并columns
引发错误KeyError
(GH 8103)DataFrame.plot(kind='scatter')
当颜色由关键字指定时,用不同颜色绘制点和错误栏的错误c
(GH 8081)错误在
Float64Index
哪里iat
并且at
没有测试并且失败(GH 8092)。在给定自定义行终止符或(GH 8122
read_csv
)的情况下未正确处理行注释的错误。delim_whitespace=True
read_html
空表导致的错误StopIteration
(GH 7575)在相同数据类型块中设置列时出现铸造错误(GH 7704)
GroupBy
当原始石斑鱼是元组时(GH 8121),从 a 访问组时出现错误。错误
.at
将接受非整数索引上的整数索引器并执行回退(GH 7814)kde 图和 NaN 的错误 ( GH 8182 )
float32 数据类型中的错误
GroupBy.count
是未排除 nan 值(GH 8169)。堆叠条形图和 NaN 的错误 ( GH 8175 )。
具有非均匀可分偏移量的重新采样中的错误(例如“7s”)(GH 8371)
limit
当不需要插值时,使用关键字的插值方法中存在错误( GH 7173)。在何时(GH 8230
col_space
)中忽略了错误。DataFrame.to_string()
header=False
DatetimeIndex.asof
错误匹配部分字符串并返回错误日期的错误( GH 8245)。修改全局 matplotlib rcParams 的绘图方法中的错误(GH 8242)。
DataFrame.__setitem__
将数据帧列设置为稀疏数组时导致错误的错误(GH 8131)Dataframe.boxplot()
当整个列为空时失败的错误( GH 8181)。可视化中变量混乱的错误
radviz
(GH 8199)。limit
当不需要插值时,使用关键字的插值方法中存在错误( GH 7173)。在何时(GH 8230
col_space
)中忽略了错误。DataFrame.to_string()
header=False
错误
to_clipboard
会剪辑长列数据(GH 8305)终端显示中的错误
DataFrame
:将 max_column/max_rows 设置为零不会触发 dfs 自动调整大小以适应终端宽度/高度(GH 7180)。OLS 中的错误,使用“cluster”和“nw_lags”参数运行无法正常工作,但也没有抛出错误(GH 5884)。
DataFrame.dropna
将子集参数中不存在的列解释为“最后一列”的错误( GH 8303)Index.intersection
非单调非唯一索引上的错误( GH 8362)。屏蔽系列分配中的错误,其中不匹配的类型会破坏对齐(GH 8387)
错误
NDFrame.equals
在 dtype=object 时给出漏报(GH 8437)索引器分配中的错误,其中类型多样性会破坏对齐(GH 8258)
NDFrame.loc
当目标是列表/ndarray 时行/列名称丢失时索引中的错误( GH 6552)如果目标是空列表/ndarray ( GH 7774 ),
NDFrame.loc
则行/列转换为 Float64Index 时索引回归该错误
Series
允许它被索引,从而DataFrame
产生意外的结果。不再允许此类索引(GH 8444)具有 MultiIndex 列的项目分配中的错误
DataFrame
,其中右侧列未对齐(GH 7655)在比较包含 NaN 的对象数组是否相等时,抑制 NumPy 生成的 FutureWarning ( GH 7065 )
错误在于运算符 ( )
DataFrame.eval()
的 dtype未正确推断为。not
~
bool
贡献者#
共有 80 人为此版本贡献了补丁。名字带有“+”的人首次贡献了补丁。
亚伦·舒马赫 +
亚当·格林霍尔
安迪·海登
安东尼·奥布莱恩 +
阿特米·科尔钦斯基 +
本·席勒 +
本尼迪克特·绍尔
本杰明·蒂罗 +
鲍里斯·维克 +
克里斯·雷诺兹 +
克里斯·斯托弗 +
帝斯曼
戴夫·克拉克 +
断腿 +
德国戈麦斯-埃雷罗 +
杨晓明 +
李欢+
金亨泰 +
艾萨克·斯拉维特 +
雅各布·谢尔
雅各布·沃瑟曼 +
扬·舒尔茨
杰夫·雷巴克
杰夫·特拉特纳
杰西·法纳姆 +
乔·布拉迪什 +
约尔格·瑞廷格 +
约翰·W·奥布莱恩
乔里斯·范登博什
凯文·谢泼德
凯尔·迈耶
麦克斯·张 +
迈克尔·米勒
迈克尔·W·沙佐夫 +
迈克·凯利
莫尔塔达·梅哈尔
内森·桑德斯 +
内森·泰潘斯基 +
保罗·马苏雷尔 +
菲利普·克劳德
彼得罗·巴蒂斯顿
伦佐·贝尔托基 +
罗斯·佩奇勒 +
沙胡尔·哈米德 +
沙尚克·阿加瓦尔 +
史蒂芬·霍耶
汤姆·奥格斯普格
汤姆·奥格斯普格
托尼·洛伦佐 +
韦斯·特纳
威尔弗雷德·休斯 +
叶夫根尼·格列奇卡 +
Yoshiki Vázquez Baeza +
贝赫扎德·努里 +
本杰明
比约宁+
德洛维尔 +
dsm054
亨特罗文斯 +
沉浸式
伊施瓦巴赫
j莫里斯0x0 +
jnmclarty +
杰雷巴克
克洛诺+
性的
mcj代码+
豆豆+
个和零
罗格
塞思-p
辛赫克斯
索梅本+
稳定+
斯塔斯-SL +
那整洁+
汤姆·奥尔康 +
未知
乌努特布
扎赫CP +