1.1.0 中的新功能(2020年7月28日)#
这是 pandas 1.1.0 中的更改。请参阅 发行说明 以获取包括其他版本 pandas 的完整更新日志。
增强功能#
loc 引发的 KeyErrors 指定了缺失的标签#
之前,如果 .loc
调用缺少标签,会引发 KeyError,指出这不再支持。
现在错误信息还包括一个缺失标签的列表(最多10项,显示宽度80个字符)。请参见 GH 34272。
所有数据类型现在都可以转换为 StringDtype
#
之前,声明或转换为 StringDtype
通常只有在数据已经是 str
或类似 nan 的情况下才可能 (GH 31204)。现在,StringDtype
在所有 astype(str)
或 dtype=str
适用的情况下都能工作:
例如,下面的内容现在可以正常工作:
In [1]: ser = pd.Series([1, "abc", np.nan], dtype="string")
In [2]: ser
Out[2]:
0 1
1 abc
2 <NA>
dtype: string
In [3]: ser[0]
Out[3]: '1'
In [4]: pd.Series([1, 2, np.nan], dtype="Int64").astype("string")
Out[4]:
0 1
1 2
2 <NA>
dtype: string
非单调 PeriodIndex 部分字符串切片#
PeriodIndex
现在支持非单调索引的部分字符串切片,反映了 DatetimeIndex
的行为 (GH 31096)
例如:
In [5]: dti = pd.date_range("2014-01-01", periods=30, freq="30D")
In [6]: pi = dti.to_period("D")
In [7]: ser_monotonic = pd.Series(np.arange(30), index=pi)
In [8]: shuffler = list(range(0, 30, 2)) + list(range(1, 31, 2))
In [9]: ser = ser_monotonic.iloc[shuffler]
In [10]: ser
Out[10]:
2014-01-01 0
2014-03-02 2
2014-05-01 4
2014-06-30 6
2014-08-29 8
..
2015-09-23 21
2015-11-22 23
2016-01-21 25
2016-03-21 27
2016-05-20 29
Freq: D, Length: 30, dtype: int64
In [11]: ser["2014"]
Out[11]:
2014-01-01 0
2014-03-02 2
2014-05-01 4
2014-06-30 6
2014-08-29 8
2014-10-28 10
2014-12-27 12
2014-01-31 1
2014-04-01 3
2014-05-31 5
2014-07-30 7
2014-09-28 9
2014-11-27 11
Freq: D, dtype: int64
In [12]: ser.loc["May 2015"]
Out[12]:
2015-05-26 17
Freq: D, dtype: int64
比较两个 DataFrame
或两个 Series
并总结差异#
我们已经添加了 DataFrame.compare()
和 Series.compare()
用于比较两个 DataFrame
或两个 Series
(GH 30429)
In [13]: df = pd.DataFrame(
....: {
....: "col1": ["a", "a", "b", "b", "a"],
....: "col2": [1.0, 2.0, 3.0, np.nan, 5.0],
....: "col3": [1.0, 2.0, 3.0, 4.0, 5.0]
....: },
....: columns=["col1", "col2", "col3"],
....: )
....:
In [14]: df
Out[14]:
col1 col2 col3
0 a 1.0 1.0
1 a 2.0 2.0
2 b 3.0 3.0
3 b NaN 4.0
4 a 5.0 5.0
In [15]: df2 = df.copy()
In [16]: df2.loc[0, 'col1'] = 'c'
In [17]: df2.loc[2, 'col3'] = 4.0
In [18]: df2
Out[18]:
col1 col2 col3
0 c 1.0 1.0
1 a 2.0 2.0
2 b 3.0 4.0
3 b NaN 4.0
4 a 5.0 5.0
In [19]: df.compare(df2)
Out[19]:
col1 col3
self other self other
0 a c NaN NaN
2 NaN NaN 3.0 4.0
更多详情请参见 用户指南。
在 groupby 键中允许 NA#
通过 groupby ,我们在 DataFrame.groupby()
和 Series.groupby()
中添加了一个 dropna
关键字,以允许在组键中包含 NA
值。用户可以将 dropna
定义为 False
,如果他们希望在 groupby 键中包含 NA
值。默认情况下,dropna
设置为 True
以保持向后兼容性 (GH 3729)
In [20]: df_list = [[1, 2, 3], [1, None, 4], [2, 1, 3], [1, 2, 2]]
In [21]: df_dropna = pd.DataFrame(df_list, columns=["a", "b", "c"])
In [22]: df_dropna
Out[22]:
a b c
0 1 2.0 3
1 1 NaN 4
2 2 1.0 3
3 1 2.0 2
# Default ``dropna`` is set to True, which will exclude NaNs in keys
In [23]: df_dropna.groupby(by=["b"], dropna=True).sum()
Out[23]:
a c
b
1.0 2 3
2.0 2 5
# In order to allow NaN in keys, set ``dropna`` to False
In [24]: df_dropna.groupby(by=["b"], dropna=False).sum()
Out[24]:
a c
b
1.0 2 3
2.0 2 5
NaN 1 4
dropna
参数的默认设置是 True
,这意味着 NA
不包含在组键中。
按键排序#
我们在 DataFrame
和 Series
的排序方法中添加了一个 key
参数,包括 DataFrame.sort_values()
、DataFrame.sort_index()
、Series.sort_values()
和 Series.sort_index()
。key
可以是任何可调用函数,该函数在排序之前按列应用于每个用于排序的列(GH 27237)。更多信息请参见 使用键的sort_values 和 使用键的sort_index。
In [25]: s = pd.Series(['C', 'a', 'B'])
In [26]: s
Out[26]:
0 C
1 a
2 B
dtype: object
In [27]: s.sort_values()
Out[27]:
2 B
0 C
1 a
dtype: object
注意这是如何按大写字母排序的。如果我们应用 Series.str.lower()
方法,我们会得到
In [28]: s.sort_values(key=lambda x: x.str.lower())
Out[28]:
1 a
2 B
0 C
dtype: object
当应用于 DataFrame
时,键按列应用于所有列,或者如果指定了 by
,则应用于子集,例如。
In [29]: df = pd.DataFrame({'a': ['C', 'C', 'a', 'a', 'B', 'B'],
....: 'b': [1, 2, 3, 4, 5, 6]})
....:
In [30]: df
Out[30]:
a b
0 C 1
1 C 2
2 a 3
3 a 4
4 B 5
5 B 6
In [31]: df.sort_values(by=['a'], key=lambda col: col.str.lower())
Out[31]:
a b
2 a 3
3 a 4
4 B 5
5 B 6
0 C 1
1 C 2
更多详情,请参见 DataFrame.sort_values()
、Series.sort_values()
和 sort_index()
中的示例和文档。
在 Timestamp 构造函数中支持 fold 参数#
Timestamp:
现在根据 PEP 495 支持仅限关键字的 fold 参数,类似于父类 datetime.datetime
。它支持将 fold 作为初始化参数接受,并从其他构造函数参数推断 fold(GH 25057, GH 31338)。支持仅限于 dateutil
时区,因为 pytz
不支持 fold。
例如:
In [32]: ts = pd.Timestamp("2019-10-27 01:30:00+00:00")
In [33]: ts.fold
Out[33]: 0
In [34]: ts = pd.Timestamp(year=2019, month=10, day=27, hour=1, minute=30,
....: tz="dateutil/Europe/London", fold=1)
....:
In [35]: ts
Out[35]: Timestamp('2019-10-27 01:30:00+0000', tz='dateutil//usr/share/zoneinfo/Europe/London')
有关使用 fold 的更多信息,请参阅用户指南中的 Fold 小节。
使用不同的时区解析带时区的格式到 to_datetime#
to_datetime()
现在支持解析包含时区名称 (%Z
) 和 UTC 偏移 (%z
) 的格式,从不同的时区转换为 UTC 通过设置 utc=True
。这将返回一个时区为 UTC 的 DatetimeIndex
,而不是如果未设置 utc=True
则返回一个 object
数据类型的 Index
(GH 32792)。
例如:
In [36]: tz_strs = ["2010-01-01 12:00:00 +0100", "2010-01-01 12:00:00 -0100",
....: "2010-01-01 12:00:00 +0300", "2010-01-01 12:00:00 +0400"]
....:
In [37]: pd.to_datetime(tz_strs, format='%Y-%m-%d %H:%M:%S %z', utc=True)
Out[37]:
DatetimeIndex(['2010-01-01 11:00:00+00:00', '2010-01-01 13:00:00+00:00',
'2010-01-01 09:00:00+00:00', '2010-01-01 08:00:00+00:00'],
dtype='datetime64[s, UTC]', freq=None)
In[37]: pd.to_datetime(tz_strs, format='%Y-%m-%d %H:%M:%S %z')
Out[37]:
Index([2010-01-01 12:00:00+01:00, 2010-01-01 12:00:00-01:00,
2010-01-01 12:00:00+03:00, 2010-01-01 12:00:00+04:00],
dtype='object')
Grouper 和 resample 现在支持参数 origin 和 offset#
Grouper
和 DataFrame.resample()
现在支持 origin
和 offset
参数。它让用户控制调整分组的时戳。(GH 31809)
分组的箱子根据时间序列起点的当天开始进行调整。这对于一天的倍数(如 30D
)或分隔一天的频率(如 90s
或 1min
)效果很好。但它可能会与不符合这一标准的某些频率产生不一致。要更改此行为,现在可以使用参数 origin
指定一个固定的时间戳。
现在有两个参数已被弃用(更多信息请参见 DataFrame.resample()
的文档):
base
应替换为offset
。loffset
应该通过在重采样后的索引DataFrame
中直接添加一个偏移量来替换。
origin
使用的小例子:
In [38]: start, end = '2000-10-01 23:30:00', '2000-10-02 00:30:00'
In [39]: middle = '2000-10-02 00:00:00'
In [40]: rng = pd.date_range(start, end, freq='7min')
In [41]: ts = pd.Series(np.arange(len(rng)) * 3, index=rng)
In [42]: ts
Out[42]:
2000-10-01 23:30:00 0
2000-10-01 23:37:00 3
2000-10-01 23:44:00 6
2000-10-01 23:51:00 9
2000-10-01 23:58:00 12
2000-10-02 00:05:00 15
2000-10-02 00:12:00 18
2000-10-02 00:19:00 21
2000-10-02 00:26:00 24
Freq: 7min, dtype: int64
使用默认行为 'start_day'
进行重采样(原点是 2000-10-01 00:00:00
):
In [43]: ts.resample('17min').sum()
Out[43]:
2000-10-01 23:14:00 0
2000-10-01 23:31:00 9
2000-10-01 23:48:00 21
2000-10-02 00:05:00 54
2000-10-02 00:22:00 24
Freq: 17min, dtype: int64
In [44]: ts.resample('17min', origin='start_day').sum()
Out[44]:
2000-10-01 23:14:00 0
2000-10-01 23:31:00 9
2000-10-01 23:48:00 21
2000-10-02 00:05:00 54
2000-10-02 00:22:00 24
Freq: 17min, dtype: int64
使用固定原点进行重采样:
In [45]: ts.resample('17min', origin='epoch').sum()
Out[45]:
2000-10-01 23:18:00 0
2000-10-01 23:35:00 18
2000-10-01 23:52:00 27
2000-10-02 00:09:00 39
2000-10-02 00:26:00 24
Freq: 17min, dtype: int64
In [46]: ts.resample('17min', origin='2000-01-01').sum()
Out[46]:
2000-10-01 23:24:00 3
2000-10-01 23:41:00 15
2000-10-01 23:58:00 45
2000-10-02 00:15:00 45
Freq: 17min, dtype: int64
如果需要,你可以用 offset
参数(一个 Timedelta
)来调整箱子,这个参数会加到默认的 origin
上。
有关完整示例,请参见:使用 origin 或 offset 来调整分组的开始位置。
fsspec 现在用于文件系统处理#
对于读写本地以外的文件系统和通过 HTTP(S) 读取,可选依赖 fsspec
将被用来分派操作 (GH 33452)。这将保持对 S3 和 GCS 存储的原有功能,这些存储已经支持,但也会增加对其他几种存储实现的支持,如 Azure Datalake 和 Blob、SSH、FTP、dropbox 和 github。有关文档和功能,请参阅 fsspec 文档。
现有的与 S3 和 GCS 接口的能力将不会受到此更改的影响,因为 fsspec
仍将引入与之前相同的包。
其他增强功能#
与 matplotlib 3.3.0 的兼容性 (GH 34850)
IntegerArray.astype()
现在支持datetime64
数据类型 (GH 32538)IntegerArray
现在实现了sum
操作 (GH 33172)添加了一个
pandas.api.indexers.FixedForwardWindowIndexer()
类,以支持在rolling
操作期间向前看的窗口。添加了一个
pandas.api.indexers.VariableOffsetWindowIndexer()
类,以支持具有非固定偏移量的rolling
操作 (GH 34994)describe()
现在包含一个datetime_is_numeric
关键字,用于控制如何汇总日期时间列 (GH 30164, GH 34798)highlight_null()
现在接受subset
参数 (GH 31345)当直接写入一个 sqlite 连接时
DataFrame.to_sql()
现在支持multi
方法 (GH 29921)pandas.errors.OptionError
现在在pandas.errors
中公开 (GH 27553)添加了
api.extensions.ExtensionArray.argmax()
和api.extensions.ExtensionArray.argmin()
(GH 24382)timedelta_range()
现在在传递start
、stop
和periods
时会推断一个频率 (GH 32377)在
IntervalIndex
上的位置切片现在支持step > 1
的切片 (GH 31658)Series.str
现在有一个fullmatch
方法,该方法将正则表达式与Series
中每一行的整个字符串进行匹配,类似于re.fullmatch
(GH 32806)。DataFrame.sample()
现在也允许将类似数组和 BitGenerator 对象传递给random_state
作为种子 (GH 32503)Index.union()
现在会对MultiIndex
对象引发RuntimeWarning
,如果对象内部是不可排序的。传递sort=False
以抑制此警告 (GH 33015)添加了
Series.dt.isocalendar()
和DatetimeIndex.isocalendar()
,它们根据 ISO 8601 日历返回包含年、周和日的DataFrame
(GH 33206, GH 34392)。DataFrame.to_feather()
方法现在支持额外的关键字参数(例如设置压缩),这些参数在 pyarrow 0.17 中添加(GH 33422)。cut()
现在将接受参数ordered
,默认值为ordered=True
。如果ordered=False
且没有提供标签,将会引发错误 (GH 33141)DataFrame.to_csv()
,DataFrame.to_pickle()
, 和DataFrame.to_json()
现在支持在使用gzip
和bz2
协议时传递一个压缩参数的字典。这可以用来设置一个自定义的压缩级别,例如,df.to_csv(path, compression={'method': 'gzip', 'compresslevel': 1}
(GH 33196)melt()
增加了一个ignore_index``(默认 ``True
)参数,如果设置为False
,可以防止方法丢弃索引(GH 17440)。Series.update()
现在接受可以强制转换为Series
的对象,例如dict
和list
,反映了DataFrame.update()
的行为(GH 33215)DataFrameGroupBy.transform()
和DataFrameGroupBy.aggregate()
获得了engine
和engine_kwargs
参数,这些参数支持使用Numba
执行函数(GH 32854, GH 33388)Resampler.interpolate()
现在支持 SciPy 插值方法scipy.interpolate.CubicSpline
作为方法cubicspline
(GH 33670)DataFrameGroupBy
和SeriesGroupBy
现在实现了sample
方法,用于在组内进行随机抽样 (GH 31775)DataFrame.to_numpy()
现在支持na_value
关键字来控制输出数组中的 NA 标记 (GH 33820)在扩展数组接口中添加了
api.extension.ExtensionArray.equals
,类似于Series.equals()
(GH 27081)最低支持的 dta 版本在
read_stata()
和StataReader
中已增加到 105 (GH 26667)。to_stata()
支持使用compression
关键字参数进行压缩。压缩可以被推断或通过字符串或包含方法和传递给压缩库的任何附加参数的字典显式设置。压缩也被添加到低级 Stata 文件写入器StataWriter
、StataWriter117
和StataWriterUTF8
(GH 26599)。HDFStore.put()
现在接受一个track_times
参数。该参数传递给PyTables
的create_table
方法 (GH 32682)。Series.plot()
和DataFrame.plot()
现在接受xlabel
和ylabel
参数,以在 x 轴和 y 轴上显示标签 (GH 9093)。制作了
Rolling
和Expanding
可迭代对象(GH 11704)将
option_context
设为contextlib.ContextDecorator
,这允许它作为一个装饰器用于整个函数 (GH 34253)。DataFrame.to_csv()
和Series.to_csv()
现在接受一个errors
参数 (GH 22610)DataFrameGroupBy.groupby.transform()
现在允许func
为pad
、backfill
和cumcount
(GH 31269)。read_json()
现在接受一个nrows
参数。(GH 33916)。DataFrame.hist()
,Series.hist()
,core.groupby.DataFrameGroupBy.hist()
, 和core.groupby.SeriesGroupBy.hist()
增加了legend
参数。设置为 True 以在直方图中显示图例。(GH 6279)concat()
和append()
现在保留扩展数据类型,例如将可空整数列与 numpy 整数列组合将不再导致对象数据类型,而是保留整数数据类型 (GH 33607, GH 34339, GH 34095)。read_gbq()
现在允许禁用进度条 (GH 33360)。read_gbq()
现在支持来自pandas-gbq
的max_results
关键字参数 (GH 34639)。DataFrame.cov()
和Series.cov()
现在支持一个新的参数ddof
以支持与相应 numpy 方法中的自由度差 (GH 34611)。DataFrame.to_html()
和DataFrame.to_string()
的col_space
参数现在接受列表或字典,以仅更改某些特定列的宽度 (GH 28917)。DataFrame.to_excel()
现在也可以写入 OpenOffice 电子表格 (.ods) 文件 (GH 27222)explode()
现在接受ignore_index
来重置索引,类似于pd.concat()
或DataFrame.sort_values()
(GH 34932)。DataFrame.to_markdown()
和Series.to_markdown()
现在接受index
参数作为 tabulate 的showindex
的别名 (GH 32667)read_csv()
现在接受像“0”、“0.0”、“1”、“1.0”这样的字符串值,可以转换为可空布尔数据类型(GH 34859)ExponentialMovingWindow
现在支持一个times
参数,该参数允许使用times
中的时间戳间隔的观测值来计算mean
(GH 34839)DataFrame.agg()
和Series.agg()
现在接受命名聚合,用于重命名输出列/索引。(GH 26513)compute.use_numba
现在作为一个配置选项存在,当可用时利用 numba 引擎(GH 33966, GH 35374)Series.plot()
现在支持非对称误差棒。以前,如果Series.plot()
接收到一个带有yerr
和/或xerr
误差值的“2xN”数组,左/下值(第一行)会被镜像,而右/上值(第二行)会被忽略。现在,第一行表示左/下误差值,第二行表示右/上误差值。(GH 9536)
值得注意的错误修复#
这些是可能具有显著行为变化的错误修复。
MultiIndex.get_indexer
正确解释 method
参数#
这恢复了 MultiIndex.get_indexer()
在 method='backfill'
或 method='pad'
时的行为,使其回到 pandas 0.23.0 之前的行为。特别是,MultiIndexes 被视为元组列表,并且填充或回填是根据这些元组列表的顺序进行的 (GH 29896)。
作为一个例子,给定:
In [47]: df = pd.DataFrame({
....: 'a': [0, 0, 0, 0],
....: 'b': [0, 2, 3, 4],
....: 'c': ['A', 'B', 'C', 'D'],
....: }).set_index(['a', 'b'])
....:
In [48]: mi_2 = pd.MultiIndex.from_product([[0], [-1, 0, 1, 3, 4, 5]])
在这里可以看到使用 mi_2
重新索引 df
和使用 method='backfill'
的区别:
pandas >= 0.23, < 1.1.0:
In [1]: df.reindex(mi_2, method='backfill')
Out[1]:
c
0 -1 A
0 A
1 D
3 A
4 A
5 C
pandas <0.23, >= 1.1.0
In [49]: df.reindex(mi_2, method='backfill')
Out[49]:
c
0 -1 A
0 A
1 B
3 C
4 D
5 NaN
并且在这里可以看到使用 method='pad'
重新索引 df
与使用 mi_2
之间的差异:
pandas >= 0.23, < 1.1.0
In [1]: df.reindex(mi_2, method='pad')
Out[1]:
c
0 -1 NaN
0 NaN
1 D
3 NaN
4 A
5 C
pandas < 0.23, >= 1.1.0
In [50]: df.reindex(mi_2, method='pad')
Out[50]:
c
0 -1 NaN
0 A
1 A
3 C
4 D
5 D
基于标签的查找失败总是引发 KeyError#
标签查找 series[key]
, series.loc[key]
和 frame.loc[key]
过去会根据键的类型和 Index
的类型引发 KeyError
或 TypeError
。现在它们一致地引发 KeyError
(GH 31867)
In [51]: ser1 = pd.Series(range(3), index=[0, 1, 2])
In [52]: ser2 = pd.Series(range(3), index=pd.date_range("2020-02-01", periods=3))
以前的行为:
In [3]: ser1[1.5]
...
TypeError: cannot do label indexing on Int64Index with these indexers [1.5] of type float
In [4] ser1["foo"]
...
KeyError: 'foo'
In [5]: ser1.loc[1.5]
...
TypeError: cannot do label indexing on Int64Index with these indexers [1.5] of type float
In [6]: ser1.loc["foo"]
...
KeyError: 'foo'
In [7]: ser2.loc[1]
...
TypeError: cannot do label indexing on DatetimeIndex with these indexers [1] of type int
In [8]: ser2.loc[pd.Timestamp(0)]
...
KeyError: Timestamp('1970-01-01 00:00:00')
新行为:
In [3]: ser1[1.5]
...
KeyError: 1.5
In [4] ser1["foo"]
...
KeyError: 'foo'
In [5]: ser1.loc[1.5]
...
KeyError: 1.5
In [6]: ser1.loc["foo"]
...
KeyError: 'foo'
In [7]: ser2.loc[1]
...
KeyError: 1
In [8]: ser2.loc[pd.Timestamp(0)]
...
KeyError: Timestamp('1970-01-01 00:00:00')
同样地,如果传递了不兼容的键,DataFrame.at()
和 Series.at()
将引发 TypeError
而不是 ValueError
,如果传递了缺失的键,则引发 KeyError
,这与 .loc[]
的行为相匹配 (GH 31722)。
在 MultiIndex 上查找失败时会引发 KeyError#
使用带有 MultiIndex
的整数进行索引,当整数类型的第一级中不存在一个或多个这些整数键时,错误地未能引发 KeyError
(GH 33539)
In [53]: idx = pd.Index(range(4))
In [54]: dti = pd.date_range("2000-01-03", periods=3)
In [55]: mi = pd.MultiIndex.from_product([idx, dti])
In [56]: ser = pd.Series(range(len(mi)), index=mi)
以前的行为:
In [5]: ser[[5]]
Out[5]: Series([], dtype: int64)
新行为:
In [5]: ser[[5]]
...
KeyError: '[5] not in index'
DataFrame.merge()
保留右帧的行顺序#
DataFrame.merge()
现在在执行右合并时保留右帧的行顺序 (GH 27453)
In [57]: left_df = pd.DataFrame({'animal': ['dog', 'pig'],
....: 'max_speed': [40, 11]})
....:
In [58]: right_df = pd.DataFrame({'animal': ['quetzal', 'pig'],
....: 'max_speed': [80, 11]})
....:
In [59]: left_df
Out[59]:
animal max_speed
0 dog 40
1 pig 11
In [60]: right_df
Out[60]:
animal max_speed
0 quetzal 80
1 pig 11
以前的行为:
>>> left_df.merge(right_df, on=['animal', 'max_speed'], how="right")
animal max_speed
0 pig 11
1 quetzal 80
新行为:
In [61]: left_df.merge(right_df, on=['animal', 'max_speed'], how="right")
Out[61]:
animal max_speed
0 quetzal 80
1 pig 11
当某些列不存在时,对 DataFrame 的多个列进行赋值#
当某些列不存在时,对 DataFrame
的多个列进行赋值,以前会将值赋给最后一列。现在,将使用正确的值构造新列。(GH 13658)
In [62]: df = pd.DataFrame({'a': [0, 1, 2], 'b': [3, 4, 5]})
In [63]: df
Out[63]:
a b
0 0 3
1 1 4
2 2 5
以前的行为:
In [3]: df[['a', 'c']] = 1
In [4]: df
Out[4]:
a b
0 1 1
1 1 1
2 1 1
新行为:
In [64]: df[['a', 'c']] = 1
In [65]: df
Out[65]:
a b c
0 1 3 1
1 1 4 1
2 1 5 1
在 groupby 归约中保持一致性#
使用 DataFrame.groupby()
并设置 as_index=True
和聚合 nunique
时,结果的列中会包含分组列。现在分组列只会出现在索引中,与其他归约操作一致。(GH 32579)
In [66]: df = pd.DataFrame({"a": ["x", "x", "y", "y"], "b": [1, 1, 2, 3]})
In [67]: df
Out[67]:
a b
0 x 1
1 x 1
2 y 2
3 y 3
以前的行为:
In [3]: df.groupby("a", as_index=True).nunique()
Out[4]:
a b
a
x 1 1
y 1 2
新行为:
In [68]: df.groupby("a", as_index=True).nunique()
Out[68]:
b
a
x 1
y 2
使用 DataFrame.groupby()
并设置 as_index=False
以及函数 idxmax
, idxmin
, mad
, nunique
, sem
, skew
, 或 std
会修改分组列。现在分组列保持不变,与其他归约操作一致。(GH 21090, GH 10355)
以前的行为:
In [3]: df.groupby("a", as_index=False).nunique()
Out[4]:
a b
0 1 1
1 1 2
新行为:
In [69]: df.groupby("a", as_index=False).nunique()
Out[69]:
a b
0 x 1
1 y 2
方法 DataFrameGroupBy.size()
以前会忽略 as_index=False
。现在分组列作为列返回,使得结果是一个 DataFrame
而不是一个 Series
。(GH 32599)
以前的行为:
In [3]: df.groupby("a", as_index=False).size()
Out[4]:
a
x 2
y 2
dtype: int64
新行为:
In [70]: df.groupby("a", as_index=False).size()
Out[70]:
a size
0 x 2
1 y 2
DataFrameGroupby.agg()
在重命名列时,使用 as_index=False
会丢失结果#
之前,当 as_index
选项设置为 False
并且结果列被重命名时,DataFrameGroupby.agg()
丢失了结果列。在这种情况下,结果值被替换为之前的索引 (GH 32240)。
In [71]: df = pd.DataFrame({"key": ["x", "y", "z", "x", "y", "z"],
....: "val": [1.0, 0.8, 2.0, 3.0, 3.6, 0.75]})
....:
In [72]: df
Out[72]:
key val
0 x 1.00
1 y 0.80
2 z 2.00
3 x 3.00
4 y 3.60
5 z 0.75
以前的行为:
In [2]: grouped = df.groupby("key", as_index=False)
In [3]: result = grouped.agg(min_val=pd.NamedAgg(column="val", aggfunc="min"))
In [4]: result
Out[4]:
min_val
0 x
1 y
2 z
新行为:
In [73]: grouped = df.groupby("key", as_index=False)
In [74]: result = grouped.agg(min_val=pd.NamedAgg(column="val", aggfunc="min"))
In [75]: result
Out[75]:
key min_val
0 x 1.00
1 y 0.80
2 z 0.75
在 DataFrame
上应用 apply 和 applymap 时,仅对第一行/列求值一次#
In [76]: df = pd.DataFrame({'a': [1, 2], 'b': [3, 6]})
In [77]: def func(row):
....: print(row)
....: return row
....:
以前的行为:
In [4]: df.apply(func, axis=1)
a 1
b 3
Name: 0, dtype: int64
a 1
b 3
Name: 0, dtype: int64
a 2
b 6
Name: 1, dtype: int64
Out[4]:
a b
0 1 3
1 2 6
新行为:
In [78]: df.apply(func, axis=1)
a 1
b 3
Name: 0, dtype: int64
a 2
b 6
Name: 1, dtype: int64
Out[78]:
a b
0 1 3
1 2 6
向后不兼容的 API 变化#
在 testing.assert_frame_equal
和 testing.assert_series_equal
中添加了 check_freq
参数#
check_freq
参数在 pandas 1.1.0 中被添加到 testing.assert_frame_equal()
和 testing.assert_series_equal()
中,并且默认为 True
。testing.assert_frame_equal()
和 testing.assert_series_equal()
现在如果索引没有相同的频率会引发 AssertionError
。在 pandas 1.1.0 之前,索引频率没有被检查。
增加了依赖项的最小版本#
一些依赖项的最低支持版本已更新(GH 33718, GH 29766, GH 29723, pytables >= 3.4.3)。如果已安装,我们现在要求:
包 |
最低版本 |
必需的 |
Changed |
---|---|---|---|
numpy |
1.15.4 |
X |
X |
pytz |
2015.4 |
X |
|
python-dateutil |
2.7.3 |
X |
X |
瓶颈 |
1.2.1 |
||
numexpr |
2.6.2 |
||
pytest (开发版) |
4.0.2 |
对于 可选库 ,一般的建议是使用最新版本。下表列出了在 pandas 开发过程中当前测试的每个库的最低版本。低于最低测试版本的可选库可能仍然有效,但不被视为受支持。
包 |
最低版本 |
Changed |
---|---|---|
beautifulsoup4 |
4.6.0 |
|
fastparquet |
0.3.2 |
|
fsspec |
0.7.4 |
|
gcsfs |
0.6.0 |
X |
lxml |
3.8.0 |
|
matplotlib |
2.2.2 |
|
numba |
0.46.0 |
|
openpyxl |
2.5.7 |
|
pyarrow |
0.13.0 |
|
pymysql |
0.7.1 |
|
pytables |
3.4.3 |
X |
s3fs |
0.4.0 |
X |
scipy |
1.2.0 |
X |
sqlalchemy |
1.1.4 |
|
xarray |
0.8.2 |
|
xlrd |
1.1.0 |
|
xlsxwriter |
0.9.8 |
|
xlwt |
1.2.0 |
|
pandas-gbq |
1.2.0 |
X |
开发变化#
现在,Cython 的最低版本是最新的错误修复版本(0.29.16)(GH 33334)。
弃用#
在
Series
上使用包含切片(例如ser[[slice(0, 4)]]
)的单项列表进行查找已被弃用,并将在未来版本中引发错误。可以将列表转换为元组,或者直接传递切片(GH 31333)。DataFrame.mean()
和DataFrame.median()
在numeric_only=None
的情况下,将在未来版本中包含datetime64
和datetime64tz
列 (GH 29941)使用
.loc
通过位置切片设置值已被弃用,并且在未来的版本中将会引发错误。请使用带有标签的.loc
或带有位置的.iloc
代替 (GH 31840)DataFrame.to_dict()
已弃用接受orient
的简称,并将在未来版本中引发 (GH 32515)Categorical.to_dense()
已被弃用,并将在未来版本中移除,请改用np.asarray(cat)
(GH 32639)在
SingleBlockManager
构造函数中的fastpath
关键字已被弃用,并将在未来版本中移除 (GH 33092)在
pandas.merge()
中将suffixes
作为set
提供已被弃用。请提供一个元组代替 (GH 33740, GH 34741)。使用像
[:, None]
这样的多维索引器对Series
进行索引以返回ndarray
现在会引发FutureWarning
。请在索引前转换为 NumPy 数组 (GH 27837)Index.is_mixed()
已被弃用,并将在未来版本中移除,请直接检查index.inferred_type
代替 (GH 32922)传递除第一个参数之外的任何参数作为位置参数给
read_html()
已被弃用。所有其他参数应作为关键字参数给出 (GH 27573)。传递任何参数但
path_or_buf
(第一个参数)给read_json()
作为位置参数已被弃用。所有其他参数应作为关键字参数给出(GH 27573)。传递除前两个之外的任何参数作为
read_excel()
的位置参数已被弃用。所有其他参数应作为关键字参数给出 (GH 27573)。pandas.api.types.is_categorical()
已被弃用,并将在未来版本中移除;请改用pandas.api.types.is_categorical_dtype()
(GH 33385)Index.get_value()
已被弃用,并将在未来版本中移除 (GH 19728)Series.dt.week()
和Series.dt.weekofyear()
已被弃用,并将在未来版本中移除,请改用Series.dt.isocalendar().week()
(GH 33595)DatetimeIndex.week()
和DatetimeIndex.weekofyear
已被弃用,将在未来版本中移除,请改用DatetimeIndex.isocalendar().week
(GH 33595)DatetimeArray.week()
和DatetimeArray.weekofyear
已被弃用,并将在未来版本中移除,请改用DatetimeArray.isocalendar().week
(GH 33595)DateOffset.__call__()
已被弃用,并将在未来版本中移除,请改用offset + other
(GH 34171)apply_index()
已被弃用,并将在未来版本中移除。请改用offset + other
(GH 34580)DataFrame.tshift()
和Series.tshift()
已被弃用,将在未来版本中移除,请改用DataFrame.shift()
和Series.shift()
(GH 11631)使用浮点键索引
Index
对象已被弃用,未来将引发IndexError
。您可以手动转换为整数键 (GH 34191)。Period.to_timestamp()
中的tz
关键字已被弃用,并将在未来版本中移除;请改用per.to_timestamp(...).tz_localize(tz)
(GH 34522)DatetimeIndex.to_perioddelta()
已被弃用,并将在未来版本中移除。请改用index - index.to_period(freq).to_timestamp()
(GH 34853)DataFrame.melt()
接受一个已存在的value_name
已被弃用,并将在未来版本中移除 (GH 34731)在
DataFrame.expanding()
函数中的center
关键字已被弃用,并将在未来版本中移除 (GH 20647)
性能提升#
在
DataFrame
和Series
之间进行axis=0
的 flex 算术运算的性能改进 (GH 31296)内部索引方法
_shallow_copy()
现在将缓存属性复制到新索引中,避免在新索引中再次创建这些属性。这可以加快许多依赖于创建现有索引副本的操作 (GH 28584, GH 32640, GH 32669)在使用
DataFrame.sparse.from_spmatrix()
构造函数从scipy.sparse
矩阵创建带有稀疏值的DataFrame
时,显著的性能提升 (GH 32821, GH 32825, GH 32826, GH 32856, GH 32858)。对 groupby 方法
Groupby.first()
和Groupby.last()
的性能改进 (GH 34178)在
factorize()
中对可空(整数和布尔)数据类型的性能改进 (GH 33064)。在构造
Categorical
对象时的性能提升 (GH 33921)修复了
pandas.qcut()
和pandas.cut()
中的性能退化问题 (GH 33921)在可空(整数和布尔)数据类型中,减少操作(
sum
、prod
、min
、max
)的性能提升(GH 30982、GH 33261、GH 33442)。在
RollingGroupby
中的性能提升 (GH 34052)算术运算 (
sub
,add
,mul
,div
) 在MultiIndex
中的性能提升 (GH 34297)当
bool_indexer
是一个list
时,DataFrame[bool_indexer]
的性能提升 (GH 33924)io.formats.style.Styler.render()
的显著性能提升,通过各种方式添加样式,例如io.formats.style.Styler.apply()
、io.formats.style.Styler.applymap()
或io.formats.style.Styler.bar()
(GH 19917)
错误修复#
Categorical#
向
Categorical.take()
传递一个无效的fill_value
会引发ValueError
而不是TypeError
(GH 33660)将包含缺失值和整数类别的
Categorical
与浮点数据类型的列在操作中如concat()
或append()
结合,现在将导致浮点列而不是对象数据类型列 (GH 33607)当将分类数据传递给带有
dtype=object
的Index
构造函数时,错误地返回了一个CategoricalIndex
而不是 object-dtype 的Index
(GH 32167)当任一元素缺失时,
Categorical
比较运算符__ne__
会错误地评估为False
的错误 (GH 32276)Categorical.fillna()
现在接受Categorical
other
参数 (GH 32420)Categorical
的 repr 没有区分int
和str
(GH 33676)
Datetimelike#
将一个非
int64
的整数数据类型传递给np.array(period_index, dtype=...)
现在会引发TypeError
而不是错误地使用int64
(GH 32255)Series.to_timestamp()
现在如果轴不是PeriodIndex
则引发TypeError
。以前会引发AttributeError
(GH 33327)Series.to_period()
现在如果轴不是DatetimeIndex
则引发TypeError
。以前会引发AttributeError
(GH 33327)在
Timestamp
中的一个错误,从模糊的纪元时间构造Timestamp
并再次调用构造函数会改变Timestamp.value()
属性 (GH 24329)DatetimeArray.searchsorted()
,TimedeltaArray.searchsorted()
,PeriodArray.searchsorted()
不识别非 pandas 标量,并错误地引发ValueError
而不是TypeError
(GH 30950)在
Timestamp
中的一个错误,当使用 dateutil 时区构造Timestamp
时,在从冬令时切换到夏令时之前的 128 纳秒内会导致不存在的时间 (GH 31043)在
Period.to_timestamp()
和Period.start_time()
中存在一个错误,当使用微秒频率时,返回的时间戳比正确时间早一纳秒 (GH 31475)DatetimeIndex
构造函数错误地接受bool
-dtype 输入 (GH 32668)DatetimeIndex.searchsorted()
中的错误,不接受list
或Series
作为其参数 (GH 32762)当传递一个字符串的
Series
时,PeriodIndex()
引发错误的缺陷 (GH 26109)在添加或减去一个
np.ndarray
且其数据类型为timedelta64
时,Timestamp
算术运算中的错误 (GH 33296)在
DatetimeIndex.to_period()
中存在一个错误,当没有参数调用时无法推断频率 (GH 33358)DatetimeIndex.tz_localize()
中的错误在某些情况下错误地保留了freq
,其中原始freq
不再有效 (GH 30511)在某些情况下,
DatetimeIndex.intersection()
中的错误导致freq
和时区丢失 (GH 33604)在
DatetimeIndex.get_indexer()
中的错误,对于混合的类似日期时间的目标会返回不正确的输出 (GH 33741)DatetimeIndex
在加减某些类型的DateOffset
对象时存在错误,错误地保留了一个无效的freq
属性 (GH 33779)在
DatetimeIndex
中的一个错误,当在一个索引上设置freq
属性时,可能会静默地改变另一个查看相同数据的索引的freq
属性 (GH 33552)DataFrame.min()
和DataFrame.max()
在调用由空pd.to_datetime()
初始化的对象时,与Series.min()
和Series.max()
返回的结果不一致。DatetimeIndex.intersection()
和TimedeltaIndex.intersection()
中的错误,结果没有正确的name
属性 (GH 33904)在
DatetimeArray.__setitem__()
,TimedeltaArray.__setitem__()
,PeriodArray.__setitem__()
中的错误,错误地允许int64
dtype 的值被静默转换 (GH 33717)在某些情况下,从
Period
中减去TimedeltaIndex
时错误地引发TypeError
,而在某些情况下应该成功,并且在某些情况下应该引发TypeError
时却引发IncompatibleFrequency
(GH 33883)在从只读的NumPy数组构建
Series
或Index
时存在一个错误,该数组具有非ns分辨率,当在时间戳范围内时,它被转换为对象dtype,而不是强制转换为datetime64[ns]
dtype (GH 34843)。在
Period
、date_range()
、period_range()
、pd.tseries.frequencies.to_offset()
中的freq
关键字不再允许元组,请改为传递字符串 (GH 34703)当将包含标量 tz-aware
Timestamp
的Series
追加到空的DataFrame
时,出现了一个错误,导致生成了一个对象列,而不是datetime64[ns, tz]
数据类型 (GH 35038)OutOfBoundsDatetime
在时间戳超出实现边界时发出改进的错误消息。(GH 32967)当没有定义规则时,
AbstractHolidayCalendar.holidays()
中的错误 (GH 31415)在比较
Tick
时,当与类似 timedelta 的对象进行比较时引发TypeError
的错误 (GH 34088)在乘以浮点数时,
Tick
乘法引发TypeError
的错误 (GH 34486)
Timedelta#
在构建一个具有高精度整数的
Timedelta
时存在错误,该错误会导致Timedelta
组件四舍五入 (GH 31354)在将
Timedelta
对象与包含timedelta64
数据类型的np.ndarray
进行比较时,错误地将所有条目视为不相等 (GH 33441)在
timedelta_range()
中产生额外点的错误 (GH 30353, GH 33498)DataFrame.resample()
中的一个错误,在边缘情况下产生了一个额外的点 (GH 30353, GH 13022, GH 33498)在
DataFrame.resample()
中的一个错误,在处理 timedelta 时忽略了loffset
参数 (GH 7687, GH 33498)Timedelta
和pandas.to_timedelta()
中的错误,忽略了字符串输入的unit
参数 (GH 12136)
时区#
在
infer_datetime_format=True
的情况下,to_datetime()
中的时区名称(例如UTC
)无法正确解析的错误 (GH 33133)
Numeric#
在
axis=0
下DataFrame.floordiv()
中的错误没有像Series.floordiv()
那样处理除以零的问题 (GH 31271)使用字符串参数
"uint64"
和errors="coerce"
时to_numeric()
中的 Bug 静默失败 (GH 32394)在
downcast="unsigned"
的情况下,to_numeric()
对空数据的处理存在错误 (GH 32493)在
numeric_only=False
且包含datetime64
类型或PeriodDtype
列时,DataFrame.mean()
中的错误不正确地引发TypeError
(GH 32426)在
level="foo"
和包含 NaN 的索引级别"foo"
的情况下,DataFrame.count()
中的错误会导致段错误 (GH 21824)。在
axis=1
的情况下,DataFrame.diff()
中的错误返回了不正确的结果,涉及混合数据类型 (GH 32995)在处理包含
pandas.NA
的可空整数列时,DataFrame.corr()
和DataFrame.cov()
中的错误导致抛出异常 (GH 33803)DataFrame
和Series
在对象类型对象和datetime64
类型对象之间的加减法中的错误 (GH 33824)在比较
Float64Index
和对象Index
时,Index.difference()
中的错误给出了不正确的结果 (GH 35217)DataFrame
缩减中的错误(例如df.min()
,df.max()
)与ExtensionArray
dtypes (GH 34520, GH 32651)Series.interpolate()
和DataFrame.interpolate()
现在如果limit_direction
是'forward'
或'both'
并且method
是'backfill'
或'bfill'
或者limit_direction
是'backward'
或'both'
并且method
是'pad'
或'ffill'
时会引发 ValueError (GH 34746)
转换#
字符串#
Interval#
在
IntervalArray
中存在一个错误,允许在设置值时更改底层数据 (GH 32782)
索引#
DataFrame.xs()
现在如果提供了level
关键字并且轴不是MultiIndex
,则会引发TypeError
。以前会引发AttributeError
(GH 33610)在带有部分时间戳的
DatetimeIndex
上进行切片时,在年末、季度末或月末附近会丢失高分辨率索引的错误 (GH 31064)在
PeriodIndex.get_loc()
中处理高分辨率字符串与PeriodIndex.get_value()
不同的问题 (GH 31172)在
Float64Index
中查找整数时,Series.at()
和DataFrame.at()
与.loc
行为不匹配的错误 (GH 31329)在
PeriodIndex.is_monotonic()
中的错误,当包含前导NaT
条目时错误地返回True
(GH 31437)在
DatetimeIndex.get_loc()
中存在一个错误,当使用转换后的整数键时会引发KeyError
,而不是用户传递的键 (GH 31425)在某些对象类型的情况下,
Series.xs()
中的错误错误地返回Timestamp
而不是datetime64
(GH 31630)在某些对象类型的情况下,
DataFrame.iat()
中的错误错误地返回Timestamp
而不是datetime
(GH 32809)当列或索引非唯一时,
DataFrame.at()
中的错误 (GH 33041)在对象类型的
Index
上使用整数键进行索引时,Series.loc()
和DataFrame.loc()
中的错误 (GH 31905)在具有重复列的
DataFrame
中,DataFrame.iloc.__setitem__()
的错误会错误地为所有匹配的列设置值 (GH 15686, GH 22036)在
DataFrame.loc()
和Series.loc()
中存在一个错误,当使用DatetimeIndex
、TimedeltaIndex
或PeriodIndex
时,错误地允许查找不匹配的类似日期时间的 dtypes (GH 32650)在
Series.__getitem__()
中使用非标准标量进行索引的错误,例如np.dtype
(GH 32684)在
DataFrame.lookup()
中的错误,当frame.index
或frame.columns
不唯一时错误地引发AttributeError
;现在这将引发一个带有帮助性错误消息的ValueError
(GH 33041)在
Interval
中的错误,其中Timedelta
不能从Timestamp
间隔中添加或减去 (GH 32023)DataFrame.copy()
中的错误在复制后未使 _item_cache 失效,导致复制后的值更新未反映出来 (GH 31784)修复了在提供
datetime64[ns, tz]
值时DataFrame.loc()
和Series.loc()
抛出错误的问题 (GH 32395)在
Series.__getitem__()
中存在一个错误,当使用整数键和一个MultiIndex
且前导整数级别时,如果键在第一级中不存在,未能引发KeyError
(GH 33355)当使用
ExtensionDtype
(例如df.iloc[:, :1]
)对单列DataFrame
进行切片时,DataFrame.iloc()
中的错误返回无效结果 (GH 32957)DatetimeIndex.insert()
和TimedeltaIndex.insert()
中的错误导致在将元素插入到空Series
时索引freq
丢失 (GH 33573)在带有
IntervalIndex
和整数类列表键的Series.__setitem__()
中存在错误 (GH 33473)在
Series.__getitem__()
中的错误允许使用np.ndarray
、Index
、Series
索引器时缺少标签,但不允许list
,现在这些都会引发KeyError
(GH 33646)在
DataFrame.truncate()
和Series.truncate()
中的错误,其中假设索引是单调递增的 (GH 33756)使用表示日期时间的字符串列表进行索引在
DatetimeIndex
或PeriodIndex
上失败(GH 11278)在使用
MultiIndex
时,Series.at()
中的错误会在有效输入上引发异常 (GH 26989)在使用值为字典的
DataFrame.loc()
时,将int
类型的列转换为float
类型的错误 (GH 34573)当与
MultiIndex
一起使用时,Series.loc()
中的错误会在访问None
值时引发IndexingError
(GH 34318)DataFrame.reset_index()
和Series.reset_index()
中的错误不会在具有MultiIndex
的空DataFrame
或Series
上保留数据类型 (GH 19602)在包含
NaT
条目的DatetimeIndex
上使用time
键对Series
和DataFrame
进行索引时存在错误 (GH 35114)
缺失#
在空的
Series
上调用fillna()
现在会正确返回一个浅拷贝的对象。该行为现在与Index
、DataFrame
和非空的Series
一致 (GH 32543)。当参数
to_replace
是字典/列表类型并且在包含<NA>
的Series
上使用时,Series.replace()
中的错误会引发TypeError
。该方法现在通过在进行替换比较时忽略<NA>
值来处理这种情况 (GH 32621)。在
any()
和all()
中存在一个错误,当使用可空布尔数据类型且skipna=False
时,对于所有False
或所有True
值不正确地返回<NA>
(GH 33253)关于使用
method=akima
进行插值的清晰文档。der
参数必须是标量或None
(GH 33426)DataFrame.interpolate()
现在使用正确的轴约定。以前沿列插值会导致沿索引插值,反之亦然。此外,使用方法pad
、ffill
、bfill
和backfill
插值与使用这些方法与DataFrame.fillna()
相同(GH 12918,GH 29146)当在具有字符串类型列名的
DataFrame
上调用DataFrame.interpolate()
时,会出现一个错误,抛出 ValueError。该方法现在与列名的类型无关 (GH 33956)使用格式规范将
NA
传递到格式字符串中现在可以正常工作。例如"{:.1f}".format(pd.NA)
以前会引发ValueError
,但现在将返回字符串"<NA>"
(GH 34740)在
Series.map()
中存在一个错误,在无效的na_action
上不会引发 (GH 32815)
MultiIndex#
DataFrame.swaplevels()
现在如果轴不是MultiIndex
则引发TypeError
。以前会引发AttributeError
(GH 31126)在使用
MultiIndex
时,Dataframe.loc()
中的错误。返回的值与给定的输入顺序不一致 (GH 22797)
In [79]: df = pd.DataFrame(np.arange(4),
....: index=[["a", "a", "b", "b"], [1, 2, 1, 2]])
....:
# Rows are now ordered as the requested keys
In [80]: df.loc[(['b', 'a'], [2, 1]), :]
Out[80]:
0
b 2 3
1 2
a 2 1
1 0
MultiIndex.intersection()
中的错误在sort=False
时不能保证保留顺序。(GH 31325)DataFrame.truncate()
中的错误会删除MultiIndex
的名称。(GH 34564)
In [81]: left = pd.MultiIndex.from_arrays([["b", "a"], [2, 1]])
In [82]: right = pd.MultiIndex.from_arrays([["a", "b", "c"], [1, 2, 3]])
# Common elements are now guaranteed to be ordered by the left side
In [83]: left.intersection(right, sort=False)
Out[83]:
MultiIndex([('b', 2),
('a', 1)],
)
当连接两个具有不同列的
MultiIndex
而不指定级别时出现错误。返回索引器参数被忽略。(GH 34074)
IO#
将
set
作为names
参数传递给pandas.read_csv()
、pandas.read_table()
或pandas.read_fwf()
将引发ValueError: Names 应该是一个有序集合。
(GH 34946)当
display.precision
为零时打印输出出现错误。(GH 20359)在
read_json()
中存在一个错误,当 json 包含大数字字符串时会发生整数溢出。(GH 30320)read_csv()
现在会在header
和prefix
参数都不为None
时引发ValueError
。 (GH 27394)在
DataFrame.to_json()
中的错误在path_or_buf
是 S3 URI 时会引发NotFoundError
(GH 28375)DataFrame.to_parquet()
中的错误覆盖了coerce_timestamps
的 pyarrow 默认值;遵循 pyarrow 的默认值允许在version="2.0"
下写入纳秒时间戳 (GH 31652)。read_csv()
中的错误在使用sep=None
与comment
关键字组合时引发TypeError
(GH 31396)在从以 Python 2 编写的固定格式读取 Python 3 中的
DataFrame
时,HDFStore
中的一个错误导致datetime64
列的 dtype 被设置为int64
(GH 31750)read_sas()
现在可以处理大于Timestamp.max
的日期和时间,并将它们返回为datetime.datetime
对象 (GH 20927)Bug in
DataFrame.to_json()
whereTimedelta
objects would not be serialized correctly withdate_format="iso"
(GH 28256)read_csv()
在parse_dates
中传递的列名在Dataframe
中缺失时会引发ValueError
(GH 31251)在
read_excel()
中的一个错误,当一个包含高代理项的 UTF-8 字符串会导致段错误 (GH 23809)read_csv()
中的错误导致在空文件上发生文件描述符泄漏 (GH 31488)read_csv()
中的错误在标题和数据行之间有空白行时会导致段错误 (GH 28071)read_csv()
中的错误在权限问题上引发了误导性的异常 (GH 23784)在
read_csv()
中的错误在header=None
且有两个额外数据列时会引发IndexError
在从Google Cloud Storage读取文件时,
read_sas()
中的错误引发了AttributeError
(GH 33069)DataFrame.to_sql()
中的一个错误,当保存越界日期时会引发AttributeError
(GH 26761)read_excel()
中的错误未能正确处理 OpenDocument 文本单元格中的多个嵌入空格。(GH 32207)在将
list
的布尔值读入Series
时,read_json()
中的错误会引发TypeError
。(GH 31464)在
pandas.io.json.json_normalize()
中的一个错误,其中由record_path
指定的位置不指向一个数组。(GH 26284)pandas.read_hdf()
在加载不支持的 HDF 文件时有一个更明确的错误信息 (GH 9539)read_feather()
中的错误在读取 s3 或 http 文件路径时会引发ArrowIOError
(GH 29055)在
to_excel()
中的错误无法处理列名render
并引发了一个KeyError
(GH 34331)execute()
中的错误在 SQL 语句包含%
字符且没有参数时,对某些 DB-API 驱动程序引发ProgrammingError
(GH 34211)在
StataReader()
中的错误,导致在使用迭代器读取数据时,分类变量具有不同的 dtypes。(GH 31544)HDFStore.keys()
现在有一个可选的include
参数,允许检索所有本地的 HDF5 表名 (GH 29916)当传递了一个意外的关键字参数时,由
read_csv()
和read_table()
引发的TypeError
异常显示为parser_f
(GH 25648)read_excel()
函数在处理 ODS 文件时存在一个错误,会删除 0.0 值 (GH 27222)ujson.encode()
中的一个错误在处理大于sys.maxsize
的数字时会引发OverflowError
(GH 34395)HDFStore.append_to_multiple()
中的一个错误在设置min_itemsize
参数时引发了一个ValueError
(GH 11238)create_table()
中的错误现在会在data_columns
中未指定column
参数时引发错误 (GH 28156)read_json()
现在可以从文件URL读取行分隔的json文件,当设置了lines
和chunksize
时。在使用 MySQL 读取包含
-np.inf
条目的 DataFrame 时,DataFrame.to_sql()
中的错误现在会有更明确的ValueError
(GH 34431)读取*函数未解压大写文件扩展名的问题 (GH 35164)
在
read_excel()
中的一个错误,当header=None
并且index_col
以list
形式给出时会引发TypeError
(GH 31783)在
MultiIndex
中使用日期时间值作为标题时,read_excel()
中的错误 (GH 34748)read_excel()
不再接受**kwds
参数。这意味着传递关键字参数chunksize
现在会引发TypeError
(之前引发NotImplementedError
),而传递关键字参数encoding
现在会引发TypeError
(GH 34464)DataFrame.to_records()
中的错误不正确地丢失了时区感知datetime64
列中的时区信息 (GH 32535)
绘图#
DataFrame.plot()
用于线/条形图现在接受通过字典的颜色 (GH 8193)。在
DataFrame.plot.hist()
中权重对多列不起作用的错误 (GH 33173)DataFrame.boxplot()
和DataFrame.plot.boxplot()
中的错误丢失了medianprops
、whiskerprops
、capprops
和boxprops
的颜色属性 (GH 30346)在
DataFrame.hist()
中的一个错误,其中column
参数的顺序被忽略 (GH 29235)在
DataFrame.plot.scatter()
中的一个错误,当添加多个具有不同cmap
的图时,颜色条总是使用第一个cmap
(GH 33389)DataFrame.plot.scatter()
中的一个错误是,即使参数c
被分配给包含颜色名称的列,也会向图中添加颜色条 (GH 34316)pandas.plotting.bootstrap_plot()
中的错误导致轴混乱和标签重叠 (GH 34905)在
DataFrame.plot.scatter()
中的错误导致在绘制可变标记大小时出现错误 (GH 32904)
GroupBy/重采样/滚动#
使用
pandas.api.indexers.BaseIndexer
与count
、min
、max
、median
、skew
、cov
、corr
现在将返回任何单调pandas.api.indexers.BaseIndexer
后代的正确结果 (GH 32865)DataFrameGroupby.mean()
和SeriesGroupby.mean`(以及类似的 :meth:`~DataFrameGroupby.median()
、std()
和var()
)现在如果传入一个不被接受的的关键字参数,会引发一个TypeError
。以前会引发一个UnsupportedFunctionCall``(如果 ``min_count
传入median()
,则是AssertionError
)(GH 31485)在
by
轴未排序、有重复项且应用的func
不修改传入对象时,DataFrameGroupBy.apply()
和SeriesGroupBy.apply()
中的错误会引发ValueError
(GH 30667)在
DataFrameGroupBy.transform()
中的错误在使用了转换函数时会产生不正确的结果 (GH 30918)DataFrameGroupBy.transform()
和SeriesGroupBy.transform()
中的错误在按多个键分组时返回了错误的结果,其中一些键是分类的,而另一些则不是 (GH 32494)在
DataFrameGroupBy.count()
和SeriesGroupBy.count()
中的错误,当分组列包含 NaN 时会导致段错误 (GH 32841)在
DataFrame.groupby()
和Series.groupby()
中的错误在聚合布尔值Series
时会产生不一致的类型 (GH 32894)在
DataFrameGroupBy.sum()
和SeriesGroupBy.sum()
中的一个错误,当非空值的数量低于可空整数类型的min_count
时,会返回一个大的负数 (GH 32861)SeriesGroupBy.quantile()
中的错误在可空整数上引发 (GH 33136)在
DataFrame.resample()
中的一个错误,当结果时区感知DatetimeIndex
在午夜有夏令时转换时会引发AmbiguousTimeError
(GH 25758)在
DataFrame.groupby()
中的一个错误,当按只读类别的分类列进行分组且sort=False
时会引发ValueError
(GH 33410)在
DataFrameGroupBy.agg()
、SeriesGroupBy.agg()
、DataFrameGroupBy.transform()
、SeriesGroupBy.transform()
、DataFrameGroupBy.resample()
和SeriesGroupBy.resample()
中的错误,其中子类未被保留 (GH 28330)在
SeriesGroupBy.agg()
中的一个错误,之前在SeriesGroupBy
的命名聚合中接受任何列名。现在行为只允许str
和可调用对象,否则会引发TypeError
。(GH 34422)在
DataFrame.groupby()
中的错误丢失了Index
的名称,当其中一个agg
键引用了一个空列表时 (GH 32580)在
Rolling.apply()
中的错误,当指定engine='numba'
时,center=True
被忽略 (GH 34784)DataFrame.ewm.cov()
中的错误在处理MultiIndex
输入时抛出AssertionError
(GH 34440)core.groupby.DataFrameGroupBy.quantile()
中的错误对非数字类型引发了TypeError
而不是删除列 (GH 27892)当
func='nunique'
且列的类型为datetime64
时,core.groupby.DataFrameGroupBy.transform()
中的 Bug 会导致结果的类型也为datetime64
而不是int64
(GH 35109)在选择列并使用
as_index=False
进行聚合时,DataFrame.groupby()
中引发AttributeError
的错误 (GH 35246)。在
DataFrameGroupBy.first()
和DataFrameGroupBy.last()
中的错误,当在多个Categoricals
上分组时会引发不必要的ValueError
(GH 34951)
Reshaping#
影响所有数值和布尔归约方法未返回子类数据类型的错误。(GH 25596)
当仅设置
MultiIndexed
列时,DataFrame.pivot_table()
中的错误 (GH 17038)在
DataFrame.unstack()
和Series.unstack()
中的错误可以在MultiIndexed
数据中接受元组名称 (GH 19966)当
margin
为True
且仅定义了column
时,DataFrame.pivot_table()
中的错误 (GH 31016)在
columns
设置为None
时,修复了DataFrame.pivot()
中的错误信息。(GH 30924)当输入是两个具有元组名称的
Series
时,crosstab()
中的错误会导致输出保留一个虚拟的MultiIndex
作为列。(GH 18321)DataFrame.pivot()
现在可以为index
和columns
参数接受列表 (GH 21425)SeriesGroupBy.aggregate()
中的错误导致当聚合共享相同名称时,聚合结果被覆盖 (GH 30880)当从
Float64Index
转换为Int64Index
或转换为ExtensionArray
dtype 时,Index.astype()
会丢失name
属性的错误 (GH 32013)Series.append()
现在在传递DataFrame
或包含DataFrame
的序列时会引发TypeError
(GH 31413)DataFrame.replace()
和Series.replace()
如果to_replace
不是预期类型,将会引发TypeError
。之前replace
会静默失败 (GH 18634)在
Series
的就地操作中的错误,该操作试图将一个列添加回它最初被删除的DataFrame`(使用 ``inplace=True`
)(GH 30484)在
DataFrame.apply()
中的一个错误,即使请求了raw=True
,回调函数仍然被调用带有Series
参数。(GH 32423)在从包含时区感知数据类型的列创建
MultiIndex
级别时,DataFrame.pivot_table()
中的错误会丢失时区信息 (GH 32558)在
concat()
中的一个错误,当传递一个非字典映射作为objs
时会引发TypeError
(GH 32863)DataFrame.agg()
现在在尝试聚合一个不存在的列时提供了更描述性的SpecificationError
消息 (GH 32755)当使用
MultiIndex
列和MultiIndex
行时,DataFrame.unstack()
中的错误 (GH 32624, GH 24729 和 GH 28306)将字典附加到
DataFrame
而不传递ignore_index=True
将引发TypeError: Can only append a dict if ignore_index=True
而不是TypeError: Can only append a :class:`Series` if ignore_index=True or if the :class:`Series` has a name
(GH 30871)DataFrame.corrwith()
,DataFrame.memory_usage()
,DataFrame.dot()
,DataFrame.idxmin()
,DataFrame.idxmax()
,DataFrame.duplicated()
,DataFrame.isin()
,DataFrame.count()
,Series.explode()
,Series.asof()
和DataFrame.asof()
中的错误未返回子类类型。(GH 31331)Dataframe.aggregate()
和Series.aggregate()
中的错误在某些情况下会导致递归循环 (GH 34224)修复了
melt()
中的一个错误,当熔化col_level > 0
的MultiIndex
列时,会在id_vars
上引发KeyError
(GH 34129)在
Series.where()
中存在一个错误,当Series
为空且cond
为非布尔数据类型时 (GH 34592)修复了
DataFrame.apply()
在S
dtype 元素上引发ValueError
的回归问题 (GH 34529)
Sparse#
从时区感知的dtype创建
SparseArray
时,会在删除时区信息之前发出警告,而不是静默地执行此操作 (GH 32501)arrays.SparseArray.from_spmatrix()
中的错误错误地读取了 scipy 稀疏矩阵 (GH 31991)在
Series.sum()
中使用SparseArray
引发了一个TypeError
(GH 25777)包含全稀疏
SparseArray
的DataFrame
在通过类列表索引时填充NaN
的错误 (GH 27781, GH 29563)SparseDtype
的 repr 现在包括其fill_value
属性的 repr。以前它使用fill_value
的字符串表示 (GH 34352)无法将空
DataFrame
转换为SparseDtype
的错误 (GH 33113)arrays.SparseArray()
中的错误在用可迭代对象索引稀疏数据帧时返回了不正确的类型 (GH 34526, GH 34540)
ExtensionArray#
修复了
Series.value_counts()
在Int64
数据类型的空输入上会引发错误的 bug (GH 33317)修复了在连接具有非重叠列的
DataFrame
对象时,concat()
中的错误,导致对象类型列而不是保留扩展类型 (GH 27692, GH 33027)修复了当
pandas.options.mode.use_inf_as_na
设置为True
时,StringArray.isna()
会返回False
的 NA 值的错误 (GH 33655)修复了导致
Series.__repr__()
崩溃的错误,该错误发生在元素为多维数组的扩展类型上 (GH 33770)。修复了
Series.update()
在缺失值的ExtensionArray
dtypes 时会引发ValueError
的错误 (GH 33980)修复了未实现
StringArray.memory_usage()
的错误 (GH 33963)修复了
DataFrameGroupBy()
在可空布尔数据类型上进行聚合时会忽略min_count
参数的错误 (GH 34051)修复了使用
dtype='string'
构造DataFrame
时会失败的错误 (GH 27953, GH 33623)修复了
IntegerArray.astype()
中的错误,以正确复制掩码 (GH 34931)。
其他#
对 object-dtype 的
Index
进行集合操作现在总是返回 object-dtype 的结果 (GH 31401)修复了
pandas.testing.assert_series_equal()
,使其在left
参数是具有check_series_type=True
的不同子类时正确引发 (GH 32670)。在
DataFrame.query()
或DataFrame.eval()
字符串中获取缺失属性会引发正确的AttributeError
(GH 32408)修复了
pandas.testing.assert_series_equal()
中的一个错误,当check_dtype
为False
时,检查了Interval
和ExtensionArray
操作数的 dtypes (GH 32747)在
DataFrame.__dir__()
中的错误在使用列名中的Unicode代理时导致段错误 (GH 25509)在允许子类相等时
DataFrame.equals()
和Series.equals()
中的错误 (GH 34402)。
贡献者#
总共有368人为此版本贡献了补丁。名字后面带有“+”的人首次贡献了补丁。
3vts +
A Brooks +
Abbie Popa +
Achmad Syarif Hidayatullah +
Adam W Bagaskarta +
Adrian Mastronardi +
Aidan Montare +
Akbar Septriyan +
Akos Furton +
Alejandro Hall +
Alex Hall +
Alex Itkes +
Alex Kirko
Ali McMaster +
Alvaro Aleman +
Amy Graham +
Andrew Schonfeld +
Andrew Shumanskiy +
Andrew Wieteska +
Angela Ambroz
Anjali Singh +
Anna Daglis
Anthony Milbourne +
Antony Lee +
Ari Sosnovsky +
Arkadeep Adhikari +
Arunim Samudra +
Ashkan +
Ashwin Prakash Nalwade +
Ashwin Srinath +
Atsushi Nukariya +
Ayappan +
Ayla Khan +
Bart +
Bart Broere +
Benjamin Beier Liu +
Benjamin Fischer +
Bharat Raghunathan
Bradley Dice +
Brendan Sullivan +
Brian Strand +
Carsten van Weelden +
Chamoun Saoma +
ChrisRobo +
Christian Chwala
Christopher Whelan
Christos Petropoulos +
Chuanzhu Xu
CloseChoice +
Clément Robert +
CuylenE +
DanBasson +
Daniel Saxton
Danilo Horta +
DavaIlhamHaeruzaman +
Dave Hirschfeld
Dave Hughes
David Rouquet +
David S +
Deepyaman Datta
Dennis Bakhuis +
Derek McCammond +
Devjeet Roy +
Diane Trout
Dina +
Dom +
Drew Seibert +
EdAbati
Emiliano Jordan +
Erfan Nariman +
Eric Groszman +
Erik Hasse +
Erkam Uyanik +
Evan D +
Evan Kanter +
Fangchen Li +
Farhan Reynaldo +
Farhan Reynaldo Hutabarat +
Florian Jetter +
Fred Reiss +
GYHHAHA +
Gabriel Moreira +
Gabriel Tutui +
Galuh Sahid
Gaurav Chauhan +
George Hartzell +
Gim Seng +
Giovanni Lanzani +
Gordon Chen +
Graham Wetzler +
Guillaume Lemaitre
Guillem Sánchez +
HH-MWB +
Harshavardhan Bachina
How Si Wei
Ian Eaves
Iqrar Agalosi Nureyza +
Irv Lustig
Iva Laginja +
JDkuba
Jack Greisman +
Jacob Austin +
Jacob Deppen +
Jacob Peacock +
Jake Tae +
Jake Vanderplas +
James Cobon-Kerr
Jan Červenka +
Jan Škoda
Jane Chen +
Jean-Francois Zinque +
Jeanderson Barros Candido +
Jeff Reback
Jered Dominguez-Trujillo +
Jeremy Schendel
Jesse Farnham
Jiaxiang
Jihwan Song +
Joaquim L. Viegas +
Joel Nothman
John Bodley +
John Paton +
Jon Thielen +
Joris Van den Bossche
Jose Manuel Martí +
Joseph Gulian +
Josh Dimarsky
Joy Bhalla +
João Veiga +
Julian de Ruiter +
Justin Essert +
Justin Zheng
KD-dev-lab +
Kaiqi Dong
Karthik Mathur +
Kaushal Rohit +
Kee Chong Tan
Ken Mankoff +
Kendall Masse
Kenny Huynh +
Ketan +
Kevin Anderson +
Kevin Bowey +
Kevin Sheppard
Kilian Lieret +
Koki Nishihara +
Krishna Chivukula +
KrishnaSai2020 +
Lesley +
Lewis Cowles +
Linda Chen +
Linxiao Wu +
Lucca Delchiaro Costabile +
MBrouns +
Mabel Villalba
Mabroor Ahmed +
Madhuri Palanivelu +
Mak Sze Chun
Malcolm +
Marc Garcia
Marco Gorelli
Marian Denes +
Martin Bjeldbak Madsen +
Martin Durant +
Martin Fleischmann +
Martin Jones +
Martin Winkel
Martina Oefelein +
Marvzinc +
María Marino +
Matheus Cardoso +
Mathis Felardos +
Matt Roeschke
Matteo Felici +
Matteo Santamaria +
Matthew Roeschke
Matthias Bussonnier
Max Chen
Max Halford +
Mayank Bisht +
Megan Thong +
Michael Marino +
Miguel Marques +
Mike Kutzma
Mohammad Hasnain Mohsin Rajan +
Mohammad Jafar Mashhadi +
MomIsBestFriend
Monica +
Natalie Jann
Nate Armstrong +
Nathanael +
Nick Newman +
Nico Schlömer +
Niklas Weber +
ObliviousParadigm +
Olga Lyashevska +
OlivierLuG +
Pandas Development Team
Parallels +
Patrick +
Patrick Cando +
Paul Lilley +
Paul Sanders +
Pearcekieser +
Pedro Larroy +
Pedro Reys
Peter Bull +
Peter Steinbach +
Phan Duc Nhat Minh +
Phil Kirlin +
Pierre-Yves Bourguignon +
Piotr Kasprzyk +
Piotr Niełacny +
Prakhar Pandey
Prashant Anand +
Puneetha Pai +
Quang Nguyễn +
Rafael Jaimes III +
Rafif +
RaisaDZ +
Rakshit Naidu +
Ram Rachum +
Red +
Ricardo Alanis +
Richard Shadrach +
Rik-de-Kort
Robert de Vries
Robin to Roxel +
Roger Erens +
Rohith295 +
Roman Yurchak
Ror +
Rushabh Vasani
Ryan
Ryan Nazareth
SAI SRAVAN MEDICHERLA +
SHUBH CHATTERJEE +
Sam Cohan
Samira-g-js +
Sandu Ursu +
Sang Agung +
SanthoshBala18 +
Sasidhar Kasturi +
SatheeshKumar Mohan +
Saul Shanabrook
Scott Gigante +
Sebastian Berg +
Sebastián Vanrell
Sergei Chipiga +
Sergey +
ShilpaSugan +
Simon Gibbons
Simon Hawkins
Simon Legner +
Soham Tiwari +
Song Wenhao +
Souvik Mandal
Spencer Clark
Steffen Rehberg +
Steffen Schmitz +
Stijn Van Hoey
Stéphan Taljaard
SultanOrazbayev +
Sumanau Sareen
SurajH1 +
Suvayu Ali +
Terji Petersen
Thomas J Fan +
Thomas Li
Thomas Smith +
Tim Swast
Tobias Pitters +
Tom +
Tom Augspurger
Uwe L. Korn
Valentin Iovene +
Vandana Iyer +
Venkatesh Datta +
Vijay Sai Mutyala +
Vikas Pandey
Vipul Rai +
Vishwam Pandya +
Vladimir Berkutov +
Will Ayd
Will Holmgren
William +
William Ayd
Yago González +
Yosuke KOBAYASHI +
Zachary Lawrence +
Zaky Bilfagih +
Zeb Nicholls +
alimcmaster1
alm +
andhikayusup +
andresmcneill +
avinashpancham +
benabel +
bernie gray +
biddwan09 +
brock +
chris-b1
cleconte987 +
dan1261 +
david-cortes +
davidwales +
dequadras +
dhuettenmoser +
dilex42 +
elmonsomiat +
epizzigoni +
fjetter
gabrielvf1 +
gdex1 +
gfyoung
guru kiran +
h-vishal
iamshwin
jamin-aws-ospo +
jbrockmendel
jfcorbett +
jnecus +
kernc
kota matsuoka +
kylekeppler +
leandermaben +
link2xt +
manoj_koneni +
marydmit +
masterpiga +
maxime.song +
mglasder +
moaraccounts +
mproszewska
neilkg
nrebena
ossdev07 +
paihu
pan Jacek +
partev +
patrick +
pedrooa +
pizzathief +
proost
pvanhauw +
rbenes
rebecca-palmer
rhshadrach +
rjfs +
s-scherrer +
sage +
sagungrp +
salem3358 +
saloni30 +
smartswdeveloper +
smartvinnetou +
themien +
timhunderwood +
tolhassianipar +
tonywu1999
tsvikas
tv3141
venkateshdatta1993 +
vivikelapoutre +
willbowditch +
willpeppo +
za +
zaki-indra +