版本 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,请参见此处 .dtSeries 的新 datetimelike 属性访问器,请参阅Datetimelike 属性 新的 DataFrame 默认显示df.info()包含内存使用情况,请参阅内存使用情况 read_csv现在默认情况下解析时会忽略空行,请参阅此处 在集合操作中使用索引的 API 更改,请参阅此处 时区处理的增强功能,请参见此处 对滚动和膨胀力矩函数进行了大量改进,请参见此处 类的内部重构Index不再是子类ndarray,请参阅内部重构 PyTables放弃对3.0.0 以下版本和numexpr2.1 以下版本的支持( GH 7990 ) 将索引文档拆分为索引和选择数据以及多索引/高级索引 将字符串方法文档拆分为“使用文本数据” 更新前检查API 更改和弃用 其他增强功能 性能改进 Bug修复 警告 在 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)。 有关完整文档,请参阅分类介绍和 API 文档。 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分别细分为小时、分钟、微秒和纳秒。hoursminutessecondsTimedelta # 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返回一个,为标量输入返回一个。现在,它将为类似列表的输入、系列输入和标量输入返回一个。Seriesnp.timedelta64TimedeltaIndexSeriesTimedelta 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 之前的Serieseg的迭代。这些现在将被包裹在.list(Series(...))timedelta64[ns]np.timedelta64Timedelta 内存使用情况# 实现了查找 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])作为objectdtype ( GH 8411 ) Timestamp.__repr__显示dateutil.tz.tzoffset信息(GH 7907) 滚动/扩展力矩改进# rolling_min()、rolling_max()、rolling_cov()、rolling_corr() 现在使用 all NaNwhen而不是 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相同结构的结果。argNaN(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()ddof1 ewma()、ewmstd()、ewmvol()、ewmvar()、ewmcov()和现在以与和函数相同的方式ewmcorr() 解释:如果(在本例中为扩展)窗口不包含至少值,则给定结果条目将是。以前的行为是设置为以第一个非值开始的条目。 (GH 7977)min_periodsrolling_*()expanding_*()NaNmin_periodsNaNmin_periodsNaN 先前的行为(注意值从index开始2,它min_periods位于index 0 (第一个非空值的索引)之后): 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 inrolling_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 有关详细信息,请参阅指数加权矩函数。 (GH 7912) 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_tableto_sql df.to_sql('table', engine, schema='other_schema') # noqa F821 pd.read_sql_table('table', engine, schema='other_schema') # noqa F821 添加了对使用( GH 2754NaN ) 写入值的支持。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()返回一个,为标量输入返回一个。现在,它将为类似列表的输入、系列输入和标量输入返回一个。Seriesnp.timedelta64TimedeltaIndexSeriesTimedelta 有关滚动和扩展功能相关的 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 时区并作为objectdtype 插入,而不是转换为简单的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 以前,这会生成一列datetime64dtype,但没有时区信息。 将列分配给现有数据帧的行为 保持不变(这已经返回带有时区的列)。df['a'] = iobject 当将多个级别传递给 时,如果级别不是所有级别名称或所有级别编号(GH 7660),stack()它现在会引发 a 。请参阅 通过堆叠和取消堆叠重塑形状。ValueError 如果具有非唯一列,则使用“固定”格式提出 a,ValueError因为生成的文件将被破坏(GH 7761)df.to_hdfdf SettingWithCopymode.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) 现在,连接任何对象都不会引发 aValueError而不是 bare Exception。 合并错误现在将是子类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): 您可能需要使用pd.read_pickle而不是unpickle pandas 版本 < 0.15.0 pickles pickle.load。请参阅泡菜文档 当使用 a 绘图时PeriodIndex,matplotlib 内部轴现在将是数组Period而不是 a PeriodIndex(这类似于 a现在DatetimeIndex传递数组的方式datetimes) MultiIndexes 现在将与其他 pandas 对象类似地进行真实性测试,请参阅此处(GH 7897)。 当直接使用 matplotlib 的函数绘制 DatetimeIndex 时plot,轴标签将不再格式化为日期,而是格式化为整数( a 的内部表示datetime64)。更新这已在 0.15.1 中修复,请参阅此处。 弃用# 属性Categorical labels和levelsattribute 已弃用并重命名为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 )DataFrameconvert_missingTrueStataMissingValueobject 绘图功能的增强: 添加layout关键字到DataFrame.plot.您可以传递一个元组,其中一个可以自动推断(GH 6667,GH 8071)。(rows, columns)-1 允许将多个轴传递给DataFrame.plot,hist和boxplot( GH 5353 , GH 6970 , GH 7069 ) 添加了对和cwith的支持( GH 7780 )colormapcolorbarDataFrame.plotkind='scatter' DataFrame.plot来自kind='hist'( GH 7809 ) 的直方图,请参阅文档。 来自DataFrame.plotwith kind='box'( GH 7998 ) 的箱线图,请参阅文档。 其他: 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 ) 如果Periodfreq 是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)engineopenpyxl1openpyxl2openpyxl DataFrame.fillna现在可以接受 aDataFrame作为填充值 ( GH 8377 ) stack()现在,当传递多个级别编号时,传递多个级别将起作用( GH 7660)。请参阅 通过堆叠和取消堆叠重塑形状。 set_names()、set_labels()和set_levels()方法现在采用可选level关键字参数来对 MultiIndex 的特定级别进行所有修改。此外,现在在 a或 a 的特定级别set_names()上操作时接受标量字符串值( GH 7792 )IndexMultiIndex 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创建(和PeriodIndexsetitem)方面的性能改进( GH 5155) Series.transform 的改进可显着提高性能(修订)(GH 6496) StataReader读取大文件时的性能改进( GH 8040、GH 8073) 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.groupbywhere无法识别级别的错误( 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=TrueNaT 错误DatetimeIndex和PeriodIndex就地加法和减法导致与正常结果不同(GH 6527) 加法和减法PeriodIndex中的错误(GH 7741)PeriodIndexTypeError 数据引发combine_first错误(GH 3367)PeriodIndexTypeError 缺少索引器的多索引切片中的错误(GH 7866) 具有各种边缘情况的多索引切片中的错误(GH 8132) 使用非标量类型对象的 MultiIndex 索引回归 ( GH 7914 ) Timestamp与 dtype 比较时==出现错误int64( GH 8058 ) 当内部引用属性时,泡菜包含中的错误DateOffset可能会引发( GH 7748)AttributeErrornormalize Panel使用major_xs和时出现错误copy=False(由于缺少 ,弃用警告失败warnings)(GH 8152)。 pickle 反序列化中的错误,对于 0.14.1 之前的容器,在匹配块和管理器项目时,带有重复项的容器试图避免歧义,而当只有一个块时,则没有歧义(GH 7794) PeriodIndex将 a放入 a 中的错误Series会转换为int64dtype,而不是object( PeriodsGH 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)AttributeErrorTimestampdateutil Float64Index使用( GH 8017 )对 MultiIndex 帧进行排序时出现错误 面板 setitem 中的错误与 a 的 rhsDataFrame进行对齐(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与DatetimeIndextz 引发的错误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会忽略rotandfontsize关键字(GH 7844) BugDatetimeIndex.value_counts不保留 tz ( GH 7735 ) PeriodIndex.value_counts结果中的错误Int64Index( GH 7735 ) DataFrame.join在索引上进行左连接并且有多个匹配项时出现错误( GH 5391) GroupBy.transform()具有未保留索引的转换的 int 组被错误截断的错误( GH 7972 )。 groupby没有名称属性的可调用对象会采用错误的路径,并生成 aDataFrame而不是 a 的错误(SeriesGH 7929) groupby当 DataFrame 分组列重复时错误消息中的错误( GH 7511 ) 错误在于read_html参数infer_types强制强制强制日期喜欢不正确(GH 7762,GH 7032)。 索引错误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.shiftnumpy 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)。 DataFrame.boxplot()生成多个轴时 y 限制设置不正确的错误( GH 7528、GH 5517)。 在给定自定义行终止符或(GH 8122read_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 8230col_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 8230col_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 +