版本 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 )

警告

在 0.15.0 中Index,内部已被重构为不再是 subclassndarray 而是 subclass PandasObject,类似于 pandas 对象的其余部分。此更改允许非常轻松地子分类和创建新索引类型。这应该是一个透明的更改,只有非常有限的 API 影响(请参阅内部重构

警告

重构将Categorical两个参数构造函数从“代码/标签和级别”更改为“值和级别(现在称为“类别”)”。这可能会导致微妙的错误。如果您 Categorical直接使用,请在更新到此 pandas 版本之前审核您的代码并将其更改为使用from_codes()构造函数。在这里查看更多内容Categorical

新功能

系列/数据帧中的分类#

Categorical现在可以包含SeriesDataFrames获得新的操作方法。感谢 Jan Schulz 提供的大部分 API/实现。 ( GH 3943GH 5313GH 5314GH 7444GH 7839GH 7848GH 7864 、 GH 7914 、GH 7768GH 8006GH 3678GH 8075GH 8076GH 81 43GH 8453GH 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 3009GH 4533GH 8209GH 8187GH 8190GH 7869GH 7661GH 8345GH 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_usageTrue.

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 感知TimestampDatetimeIndex现在删除保存本地时间的时区,以前这会导致ExceptionTypeErrorGH 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,而不是ExceptionGH 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 7766len(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 7925GH 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

  • ddofexpanding_cov()和添加了可选参数rolling_cov()。的默认值1是向后兼容的。 ( GH 8279 )

  • 记录了、、 和 的ddof论点。这些函数对参数(默认值为)的支持 以前没有记录。 (GH 8064expanding_var()expanding_std()rolling_var()rolling_std()ddof1

  • ewma()ewmstd()ewmvol()ewmvar()ewmcov()和现在以与和函数相同的方式ewmcorr() 解释:如果(在本例中为扩展)窗口不包含至少值,则给定结果条目将是。以前的行为是设置为以第一个非值开始的条目。 (GH 7977min_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=0min_periods=1GH 8080

  • 单个值中的错误会产生令人困惑的错误消息expanding_std()(GH 7900expanding_var()

  • Bug inrolling_std()rolling_var()for a single value generated0而不是NaN( GH 7900 )

  • ewmstd()ewmvol()ewmvar()ewmcov() 计算go偏因子时出现错误bias=False(默认)。以前,基于adjust=Trueignore_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.datedatetime.time对象列的支持。to_sql

  • 添加了对使用and ( GH 7441GH 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 8511GH 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_csvread_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 7761df.to_hdfdf

  • SettingWithCopymode.chained_assignment现在,当使用链式赋值在切片混合数据类型 DataFrame 上设置值时,将发出引发/警告(根据选项)。 (GH 7845GH 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
    
  • mergeDataFrame.mergeordered_merge现在返回与参数相同的类型leftGH 7737)。

  • 以前,使用混合 dtype 框架的放大效果与.append保留 dtypes 不同(相关GH 2578GH 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而不是原始错误ExceptionGH 8501

  • DataFrame.plot并且Series.plot关键字现在具有一致的顺序(GH 8037

内部重构#

在 0.15.0 中Index,内部已被重构为不再是 subclassndarray 而是 subclass PandasObject,类似于 pandas 对象的其余部分。此更改允许非常轻松地子分类和创建新索引类型。这应该是一个透明的更改,只有非常有限的 API 影响(GH 5080GH 7439GH 7796GH 8024GH 8367GH 7997GH 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 labelslevelsattribute 已弃用并重命名为codescategories

  • outtype的参数已pd.DataFrame.to_dict被弃用,取而代之的是orient。 (GH 7840

  • convert_dummies方法已被弃用,取而代之的是 get_dummiesGH 8140

  • infer_dst中的参数将tz_localize被弃用,以 ambiguous允许在处理 DST 转换时具有更大的灵活性。替换infer_dst=Trueambiguous='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 7762GH 7032)。

删除先前版本的弃用/更改#

  • 删除DataFrame.delevel方法有利于DataFrame.reset_index

增强功能#

Stata 文件导入/导出方面的增强功能:

  • 添加了对 bool、uint8、uint16 和 uint32 数据类型的支持to_stataGH 7097GH 7365

  • 导入 Stata 文件时添加转换选项(GH 8527

  • DataFrame.to_stataStataWriter检查字符串长度是否与 dta 文件中施加的限制兼容,其中固定宽度字符串必须包含 244 个或更少的字符。尝试写入字符串长度超过 244 个字符的 Stata dta 文件会引发ValueError. (GH 7858

  • read_stata并且可以通过将参数设置为来StataReader将丢失的数据信息导入到 a 中 。使用此选项时,缺失值将作为 包含缺失值的对象和列具有数据类型而返回。 ( GH 8045 )DataFrameconvert_missingTrueStataMissingValueobject

绘图功能的增强:

  • 添加layout关键字到DataFrame.plot.您可以传递一个元组,其中一个可以自动推断(GH 6667GH 8071)。(rows, columns)-1

  • 允许将多个轴传递给DataFrame.plot,histboxplot( 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 8002GH 8044

  • 向对象添加了searchsorted方法SeriesGH 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 7708resolution相同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]
    
  • PeriodPeriodIndex支持加法/减法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 7177engineopenpyxl1openpyxl2openpyxl

  • 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 7892GH 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现在支持duplicateddrop_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 8040GH 8073

  • StataWriter写入大文件时的性能改进( GH 8079

  • 多键性能和内存使用改进groupbyGH 8128

  • groupby 的性能改进.agg以及.apply内置 max/min 未映射到 numpy/cythonized 版本(GH 7722

  • 写入 sql ( to_sql) 的性能提升高达 50% ( GH 8208 )。

  • 大值 ngroup 的 groupby 性能基准测试(GH 6787

  • 性能改进CustomBusinessDayCustomBusinessMonth( GH 8236 )

  • MultiIndex.values包含日期时间的多级索引的性能改进( GH 8543

Bug修复

  • 使用边距和 dict aggfunc 时,pivot_table 中的错误(GH 8349

  • 返回视图的read_csv位置错误( GH 8217squeeze=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 7930format='%Y%m%d'coerce=TrueNaT

  • 错误DatetimeIndexPeriodIndex就地加法和减法导致与正常结果不同(GH 6527

  • 加法和减法PeriodIndex中的错误(GH 7741PeriodIndexTypeError

  • 数据引发combine_first错误(GH 3367PeriodIndexTypeError

  • 缺少索引器的多索引切片中的错误(GH 7866

  • 具有各种边缘情况的多索引切片中的错误(GH 8132

  • 使用非标量类型对象的 MultiIndex 索引回归 ( GH 7914 )

  • Timestamp与 dtype 比较时==出现错误int64( GH 8058 )

  • 当内部引用属性时,泡菜包含中的错误DateOffset可能会引发( GH 7748AttributeErrornormalize

  • 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 8046GH 8430)进行转换时出现错误

  • 重复时间序列线和面积图中的错误可能会导致ValueError类型错误(GH 7733

  • MultiIndex带输入的推理中的错误datetime.dateGH 7888

  • 错误,get其中 anIndexError不会导致返回默认值(GH 7725

  • 错误offsets.applyrollforwardrollback可能重置纳秒(GH 7697

  • 错误offsets.apply,如果有tzinforollforward可能rollback会引发错误(GH 7697AttributeErrorTimestampdateutil

  • Float64Index使用( GH 8017 )对 MultiIndex 帧进行排序时出现错误

  • 面板 setitem 中的错误与 a 的 rhsDataFrame进行对齐(GH 7763

  • 错误is_superperiodis_subperiod无法处理比SGH 7760GH 7772GH 7803)更高的频率

  • 32 位平台中的错误Series.shift( GH 8129 )

  • PeriodIndex.unique返回 int64中的错误np.ndarrayGH 7540

  • groupby.apply函数中存在非影响性突变( GH 8467

  • DataFrame.reset_index其中包含MultiIndexPeriodIndexDatetimeIndextz 引发的错误ValueErrorGH 7746GH 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 7762GH 7032)。

  • 索引错误Series.str.cat,该索引被过滤为不包含第一项(GH 7857

  • 错误无法从字符串Timestamp解析( GH 7878nanosecond

  • 字符串Timestamp偏移量错误且tz结果不正确(GH 7833

  • 错误tslib.tz_converttslib.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=TrueGH 8027

  • PeriodPeriodIndex加法/减法导致np.timedelta64不正确的内部表示(GH 7740

  • Holiday没有偏移或遵守的错误( GH 7987

  • DataFrame.to_latex当列或索引为MultiIndex( GH 7982 ) 时格式错误。

  • DateOffset夏令时周围的错误会产生意想不到的结果( GH 5175)。

  • DataFrame.shiftnumpy 1.7上空列抛出的错误ZeroDivisionErrorGH 8019

  • 安装中html_encoding/*.html未安装的错误,因此某些测试未正确运行(GH 7927)。

  • 未测试对象的 read_html错误(GH 7927)。bytes_read

  • DataFrame.stack()当其中一个列级别为日期类型时出现错误( GH 8039

  • DataFrame使用(GH 8116)广播 numpy 标量时出现错误

  • pivot_table使用无名执行错误indexcolumns引发错误KeyErrorGH 8103

  • DataFrame.plot(kind='scatter')当颜色由关键字指定时,用不同颜色绘制点和错误栏的错误cGH 8081

  • 错误在Float64Index哪里iat并且at没有测试并且失败(GH 8092)。

  • DataFrame.boxplot()生成多个轴时 y 限制设置不正确的错误( GH 7528GH 5517)。

  • 在给定自定义行终止符或(GH 8122read_csv )的情况下未正确处理行注释的错误。delim_whitespace=True

  • read_html空表导致的错误StopIterationGH 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)。

  • 可视化中变量混乱的错误radvizGH 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 +