1.3.0 中的新功能 (2021年7月2日)#

这些是 pandas 1.3.0 中的更改。有关完整的更改日志,包括其他版本的 pandas,请参见 发行说明

警告

当读取新的 Excel 2007+ (.xlsx) 文件时,read_excel() 的默认参数 engine=None 现在将在所有情况下使用 openpyxl 引擎,当选项 io.excel.xlsx.reader 设置为 "auto" 时。以前,某些情况下会使用 xlrd 引擎。有关此更改的背景,请参见 What’s new 1.2.0

增强功能#

读取csv或json文件时的自定义HTTP(s)头#

当从一个fsspec不处理的远程URL(例如HTTP和HTTPS)读取时,传递给``storage_options``的字典将用于创建包含在请求中的头。这可以用来控制User-Agent头或发送其他自定义头(GH 36688)。例如:

In [1]: headers = {"User-Agent": "pandas"}
In [2]: df = pd.read_csv(
   ...:     "https://download.bls.gov/pub/time.series/cu/cu.item",
   ...:     sep="\t",
   ...:     storage_options=headers
   ...: )

读取和写入 XML 文档#

我们添加了 I/O 支持,以使用 read_xml()DataFrame.to_xml() 读取和渲染 XML 文档的浅层版本。使用 lxml 作为解析器,可以使用 XPath 1.0 和 XSLT 1.0。(GH 27554)

In [1]: xml = """<?xml version='1.0' encoding='utf-8'?>
   ...: <data>
   ...:  <row>
   ...:     <shape>square</shape>
   ...:     <degrees>360</degrees>
   ...:     <sides>4.0</sides>
   ...:  </row>
   ...:  <row>
   ...:     <shape>circle</shape>
   ...:     <degrees>360</degrees>
   ...:     <sides/>
   ...:  </row>
   ...:  <row>
   ...:     <shape>triangle</shape>
   ...:     <degrees>180</degrees>
   ...:     <sides>3.0</sides>
   ...:  </row>
   ...:  </data>"""

In [2]: df = pd.read_xml(xml)
In [3]: df
Out[3]:
      shape  degrees  sides
0    square      360    4.0
1    circle      360    NaN
2  triangle      180    3.0

In [4]: df.to_xml()
Out[4]:
<?xml version='1.0' encoding='utf-8'?>
<data>
  <row>
    <index>0</index>
    <shape>square</shape>
    <degrees>360</degrees>
    <sides>4.0</sides>
  </row>
  <row>
    <index>1</index>
    <shape>circle</shape>
    <degrees>360</degrees>
    <sides/>
  </row>
  <row>
    <index>2</index>
    <shape>triangle</shape>
    <degrees>180</degrees>
    <sides>3.0</sides>
  </row>
</data>

更多信息,请参见用户指南中关于 IO 工具的 编写 XML

样式增强#

我们对 Styler 进行了一些重点开发。另请参阅修订和改进后的 Styler 文档 (GH 39720, GH 39317, GH 40493)。

DataFrame 构造函数在处理 copy=False 时尊重字典#

当将字典传递给 DataFrame 并设置 copy=False 时,将不再进行复制 (GH 32960)。

In [1]: arr = np.array([1, 2, 3])

In [2]: df = pd.DataFrame({"A": arr, "B": arr.copy()}, copy=False)

In [3]: df
Out[3]: 
   A  B
0  1  1
1  2  2
2  3  3

df["A"] 仍然是 arr 的一个视图:

In [4]: arr[0] = 0

In [5]: assert df.iloc[0, 0] == 0

当不传递 copy 时的默认行为将保持不变,即会进行复制。

PyArrow 支持的字符串数据类型#

我们已经增强了 StringDtype,这是一个专门用于字符串数据的扩展类型。(GH 39908)

现在可以为 StringDtype 指定一个 storage 关键字选项。使用 pandas 选项或通过 dtype='string[pyarrow]' 指定 dtype,以允许 StringArray 由 PyArrow 数组而不是 Python 对象的 NumPy 数组支持。

PyArrow 支持的 StringArray 需要安装 pyarrow 1.0.0 或更高版本。

警告

string[pyarrow] 目前被认为是实验性的。其实现和部分API可能会在没有警告的情况下发生变化。

In [6]: pd.Series(['abc', None, 'def'], dtype=pd.StringDtype(storage="pyarrow"))
Out[6]: 
0     abc
1    <NA>
2     def
dtype: string

你也可以使用别名 "string[pyarrow]"

In [7]: s = pd.Series(['abc', None, 'def'], dtype="string[pyarrow]")

In [8]: s
Out[8]: 
0     abc
1    <NA>
2     def
dtype: string

你也可以使用 pandas 选项创建一个由 PyArrow 支持的字符串数组。

In [9]: with pd.option_context("string_storage", "pyarrow"):
   ...:     s = pd.Series(['abc', None, 'def'], dtype="string")
   ...: 

In [10]: s
Out[10]: 
0     abc
1    <NA>
2     def
dtype: string

通常的字符串访问方法仍然有效。在适当的情况下,Series 或 DataFrame 列的返回类型也将具有字符串 dtype。

In [11]: s.str.upper()
Out[11]: 
0     ABC
1    <NA>
2     DEF
dtype: string

In [12]: s.str.split('b', expand=True).dtypes
Out[12]: 
0    string[pyarrow]
1    string[pyarrow]
dtype: object

返回整数的字符串访问器方法将返回一个具有 Int64Dtype 的值

In [13]: s.str.count("a")
Out[13]: 
0       1
1    <NA>
2       0
dtype: Int64

居中的类似日期时间的滚动窗口#

在对具有类似日期时间索引的 DataFrame 和 Series 对象执行滚动计算时,现在可以使用居中的类似日期时间窗口 (GH 38780)。例如:

In [14]: df = pd.DataFrame(
   ....:     {"A": [0, 1, 2, 3, 4]}, index=pd.date_range("2020", periods=5, freq="1D")
   ....: )
   ....: 

In [15]: df
Out[15]: 
            A
2020-01-01  0
2020-01-02  1
2020-01-03  2
2020-01-04  3
2020-01-05  4

In [16]: df.rolling("2D", center=True).mean()
Out[16]: 
              A
2020-01-01  0.5
2020-01-02  1.5
2020-01-03  2.5
2020-01-04  3.5
2020-01-05  4.0

其他增强功能#

值得注意的错误修复#

这些是可能会有显著行为变化的错误修复。

Categorical.unique 现在总是保持与原始数据相同的 dtype#

之前,当调用 Categorical.unique() 处理分类数据时,新数组中未使用的类别会被移除,使得新数组的 dtype 与原始数组不同 (GH 18291)

作为一个例子,给定:

In [17]: dtype = pd.CategoricalDtype(['bad', 'neutral', 'good'], ordered=True)

In [18]: cat = pd.Categorical(['good', 'good', 'bad', 'bad'], dtype=dtype)

In [19]: original = pd.Series(cat)

In [20]: unique = original.unique()

以前的行为:

In [1]: unique
['good', 'bad']
Categories (2, object): ['bad' < 'good']
In [2]: original.dtype == unique.dtype
False

新行为:

In [21]: unique
Out[21]: 
['good', 'bad']
Categories (3, object): ['bad' < 'neutral' < 'good']

In [22]: original.dtype == unique.dtype
Out[22]: True

DataFrame.combine_first() 中保留数据类型#

DataFrame.combine_first() 现在将保留 dtypes (GH 7509)

In [23]: df1 = pd.DataFrame({"A": [1, 2, 3], "B": [1, 2, 3]}, index=[0, 1, 2])

In [24]: df1
Out[24]: 
   A  B
0  1  1
1  2  2
2  3  3

In [25]: df2 = pd.DataFrame({"B": [4, 5, 6], "C": [1, 2, 3]}, index=[2, 3, 4])

In [26]: df2
Out[26]: 
   B  C
2  4  1
3  5  2
4  6  3

In [27]: combined = df1.combine_first(df2)

以前的行为:

In [1]: combined.dtypes
Out[2]:
A    float64
B    float64
C    float64
dtype: object

新行为:

In [28]: combined.dtypes
Out[28]: 
A    float64
B      int64
C    float64
dtype: object

Groupby 方法 agg 和 transform 不再更改可调用对象的返回数据类型#

之前,方法 DataFrameGroupBy.aggregate()SeriesGroupBy.aggregate()DataFrameGroupBy.transform()SeriesGroupBy.transform() 在参数 func 是可调用对象时可能会转换结果的数据类型,这可能会导致不希望的结果 (GH 21240)。如果结果是数值型,并且通过 np.allclose 测量,转换回输入数据类型不会改变任何值,则会发生这种转换。现在不会发生这种转换。

In [29]: df = pd.DataFrame({'key': [1, 1], 'a': [True, False], 'b': [True, True]})

In [30]: df
Out[30]: 
   key      a     b
0    1   True  True
1    1  False  True

以前的行为:

In [5]: df.groupby('key').agg(lambda x: x.sum())
Out[5]:
        a  b
key
1    True  2

新行为:

In [31]: df.groupby('key').agg(lambda x: x.sum())
Out[31]: 
     a  b
key      
1    1  2

float 结果用于 DataFrameGroupBy.mean()DataFrameGroupBy.median()GDataFrameGroupBy.var()SeriesGroupBy.mean()SeriesGroupBy.median()SeriesGroupBy.var()#

之前,这些方法可能会根据输入值产生不同的 dtypes。现在,这些方法将始终返回一个浮点 dtype。(GH 41137)

In [32]: df = pd.DataFrame({'a': [True], 'b': [1], 'c': [1.0]})

以前的行为:

In [5]: df.groupby(df.index).mean()
Out[5]:
        a  b    c
0    True  1  1.0

新行为:

In [33]: df.groupby(df.index).mean()
Out[33]: 
     a    b    c
0  1.0  1.0  1.0

在使用 lociloc 设置值时,尝试就地操作#

当使用 lociloc 设置整个列时,pandas 会尝试将值插入现有数据中,而不是创建一个全新的数组。

In [34]: df = pd.DataFrame(range(3), columns=["A"], dtype="float64")

In [35]: values = df.values

In [36]: new = np.array([5, 6, 7], dtype="int64")

In [37]: df.loc[[0, 1, 2], "A"] = new

在新旧行为中,values 中的数据都被覆盖,但在旧行为中,df["A"] 的 dtype 变为 int64

以前的行为:

In [1]: df.dtypes
Out[1]:
A    int64
dtype: object
In [2]: np.shares_memory(df["A"].values, new)
Out[2]: False
In [3]: np.shares_memory(df["A"].values, values)
Out[3]: False

在 pandas 1.3.0 中,df 继续与 values 共享数据

新行为:

In [38]: df.dtypes
Out[38]: 
A    float64
dtype: object

In [39]: np.shares_memory(df["A"], new)
Out[39]: False

In [40]: np.shares_memory(df["A"], values)
Out[40]: True

在设置 frame[keys] = values 时,切勿进行就地操作#

当使用 frame[keys] = values 设置多列时,新数组将替换这些键的现有数组,这些数组将 不会 被覆盖 (GH 39510)。因此,这些列将保留 values 的 dtype,绝不会转换为现有数组的 dtype。

In [41]: df = pd.DataFrame(range(3), columns=["A"], dtype="float64")

In [42]: df[["A"]] = 5

在旧的行为中,5 被转换为 float64 并插入到现有的数组中,该数组支持 df

以前的行为:

In [1]: df.dtypes
Out[1]:
A    float64

在新行为中,我们得到一个新数组,并保留一个整数类型的 5

新行为:

In [43]: df.dtypes
Out[43]: 
A    int64
dtype: object

在设置为布尔序列时进行一致的类型转换#

将非布尔值设置到 dtype=boolSeries 中现在一致地转换为 dtype=object (GH 38709)

In [1]: orig = pd.Series([True, False])

In [2]: ser = orig.copy()

In [3]: ser.iloc[1] = np.nan

In [4]: ser2 = orig.copy()

In [5]: ser2.iloc[1] = 2.0

以前的行为:

In [1]: ser
Out [1]:
0    1.0
1    NaN
dtype: float64

In [2]:ser2
Out [2]:
0    True
1     2.0
dtype: object

新行为:

In [1]: ser
Out [1]:
0    True
1     NaN
dtype: object

In [2]:ser2
Out [2]:
0    True
1     2.0
dtype: object

DataFrameGroupBy.rolling 和 SeriesGroupBy.rolling 不再在值中返回分组列#

group-by 列现在将从 groupby.rolling 操作的结果中删除 (GH 32262)

In [44]: df = pd.DataFrame({"A": [1, 1, 2, 3], "B": [0, 1, 2, 3]})

In [45]: df
Out[45]: 
   A  B
0  1  0
1  1  1
2  2  2
3  3  3

以前的行为:

In [1]: df.groupby("A").rolling(2).sum()
Out[1]:
       A    B
A
1 0  NaN  NaN
1    2.0  1.0
2 2  NaN  NaN
3 3  NaN  NaN

新行为:

In [46]: df.groupby("A").rolling(2).sum()
Out[46]: 
       B
A       
1 0  NaN
  1  1.0
2 2  NaN
3 3  NaN

在滚动方差和标准差中移除了人工截断#

Rolling.std()Rolling.var() 将不再人为地将小于 ~1e-8~1e-15 的结果分别截断为零 (GH 37051, GH 40448, GH 39872)。

然而,在滚动较大值时,结果中可能现在存在浮点数伪影。

In [47]: s = pd.Series([7, 5, 5, 5])

In [48]: s.rolling(3).var()
Out[48]: 
0         NaN
1         NaN
2    1.333333
3    0.000000
dtype: float64

具有 MultiIndex 的 DataFrameGroupBy.rolling 和 SeriesGroupBy.rolling 在结果中不再删除级别#

DataFrameGroupBy.rolling()SeriesGroupBy.rolling() 将不再在结果中删除具有 MultiIndexDataFrame 的级别。这可能导致结果中的 MultiIndex 级别出现感知上的重复,但这一更改恢复了 1.1.3 版本中的行为(GH 38787, GH 38523)。

In [49]: index = pd.MultiIndex.from_tuples([('idx1', 'idx2')], names=['label1', 'label2'])

In [50]: df = pd.DataFrame({'a': [1], 'b': [2]}, index=index)

In [51]: df
Out[51]: 
               a  b
label1 label2      
idx1   idx2    1  2

以前的行为:

In [1]: df.groupby('label1').rolling(1).sum()
Out[1]:
          a    b
label1
idx1    1.0  2.0

新行为:

In [52]: df.groupby('label1').rolling(1).sum()
Out[52]: 
                        a    b
label1 label1 label2          
idx1   idx1   idx2    1.0  2.0

向后不兼容的 API 变化#

增加了依赖项的最小版本#

一些依赖项的最低支持版本已更新。如果已安装,我们现在要求:

最低版本

必需的

Changed

numpy

1.17.3

X

X

pytz

2017.3

X

python-dateutil

2.7.3

X

瓶颈

1.2.1

numexpr

2.7.0

X

pytest (开发版)

6.0

X

mypy (dev)

0.812

X

setuptools

38.6.0

X

对于 可选库 ,一般的建议是使用最新版本。下表列出了每个库在 pandas 开发过程中当前测试的最低版本。低于最低测试版本的可选库可能仍然有效,但不被视为支持。

最低版本

Changed

beautifulsoup4

4.6.0

fastparquet

0.4.0

X

fsspec

0.7.4

gcsfs

0.6.0

lxml

4.3.0

matplotlib

2.2.3

numba

0.46.0

openpyxl

3.0.0

X

pyarrow

0.17.0

X

pymysql

0.8.1

X

pytables

3.5.1

s3fs

0.4.0

scipy

1.2.0

sqlalchemy

1.3.0

X

tabulate

0.8.7

X

xarray

0.12.0

xlrd

1.2.0

xlsxwriter

1.0.2

xlwt

1.3.0

pandas-gbq

0.12.0

更多信息请参见 依赖项可选依赖项

其他 API 更改#

  • 部分初始化的 CategoricalDtype 对象(即那些 categories=None 的对象)将不再与完全初始化的 dtype 对象进行相等比较 (GH 38516)

  • DataFrame 上访问 _constructor_expanddim 和在 Series 上访问 _constructor_sliced 现在会引发 AttributeError。以前会引发 NotImplementedError (GH 38782)

  • DataFrame.to_sql() 添加了新的 engine**engine_kwargs 参数,以支持其他未来的 “SQL 引擎”。目前我们仍然只在底层使用 SQLAlchemy,但计划支持更多引擎,例如 turbodbc (GH 36893)

  • PeriodIndex 的字符串表示中移除了多余的 freq (GH 41653)

  • ExtensionDtype.construct_array_type() 现在是对 ExtensionDtype 子类的必需方法,而不是可选方法 (GH 24860)

  • 对不可哈希的 pandas 对象调用 hash 现在会引发内置错误消息的 TypeError (例如 unhashable type: 'Series')。以前它会引发自定义消息,例如 'Series' 对象是可变的,因此它们不能被哈希。此外,isinstance(<Series>, abc.collections.Hashable) 现在将返回 False (GH 40013)

  • Styler.from_custom_template() 现在有两个新的模板名称参数,并且由于引入了模板继承以更好地解析(GH 42053),删除了旧的 name。还需要对 Styler 属性进行子类化修改。

构建#

  • .pptx.pdf 格式的文档不再包含在轮子或源代码分发中。(GH 30741)

弃用#

在 DataFrame 缩减和 DataFrameGroupBy 操作中弃用丢弃烦扰列#

DataFrame 上调用一个归约(例如 .min.max.sum)并且 numeric_only=None``(默认值),在归约引发 ``TypeError 的列会被静默忽略并从结果中丢弃。

此行为已被弃用。在未来的版本中,将引发 TypeError ,用户需要在调用函数之前仅选择有效列。

例如:

In [53]: df = pd.DataFrame({"A": [1, 2, 3, 4], "B": pd.date_range("2016-01-01", periods=4)})

In [54]: df
Out[54]: 
   A          B
0  1 2016-01-01
1  2 2016-01-02
2  3 2016-01-03
3  4 2016-01-04

旧行为:

In [3]: df.prod()
Out[3]:
Out[3]:
A    24
dtype: int64

未来行为:

In [4]: df.prod()
...
TypeError: 'DatetimeArray' does not implement reduction 'prod'

In [5]: df[["A"]].prod()
Out[5]:
A    24
dtype: int64

同样地,当对 DataFrameGroupBy 应用函数时,当前在函数引发 TypeError 的列会被静默忽略并从结果中丢弃。

此行为已被弃用。在未来的版本中,将引发 TypeError ,用户需要在调用函数之前仅选择有效列。

例如:

In [55]: df = pd.DataFrame({"A": [1, 2, 3, 4], "B": pd.date_range("2016-01-01", periods=4)})

In [56]: gb = df.groupby([1, 1, 2, 2])

旧行为:

In [4]: gb.prod(numeric_only=False)
Out[4]:
A
1   2
2  12

未来行为:

In [5]: gb.prod(numeric_only=False)
...
TypeError: datetime64 type does not support prod operations

In [6]: gb[["A"]].prod(numeric_only=False)
Out[6]:
    A
1   2
2  12

其他弃用#

性能提升#

错误修复#

Categorical#

Datetimelike#

  • DataFrameSeries 构造函数有时会从 Timestamp`(分别是 :class:`Timedelta)``data`` 中丢弃纳秒,使用 dtype=datetime64[ns]``(分别是 ``timedelta64[ns])(GH 38032

  • DataFrame.first()Series.first() 中存在一个错误,当第一个日期是某个月的最后一天时,使用一个月的偏移量会返回错误的结果 (GH 29623)

  • 在构建 DataFrameSeries 时,如果 datetime64 数据和 timedelta64 dtype 不匹配,或者反之,未能引发 TypeError 的错误 (GH 38575, GH 38764, GH 38792)

  • 在构建 SeriesDataFrame 时,使用超出 datetime64[ns] dtype 范围的 datetime 对象或超出 timedelta64[ns] dtype 范围的 timedelta 对象的错误 (GH 38792, GH 38965)

  • DatetimeIndex.intersection()DatetimeIndex.symmetric_difference()PeriodIndex.intersection()PeriodIndex.symmetric_difference() 中存在一个错误,当与 CategoricalIndex 操作时总是返回 object-dtype (GH 38741)

  • DatetimeIndex.intersection() 中存在一个错误,当频率为非Tick且 n != 1 时,结果不正确 (GH 42104)

  • Series.where() 中的错误不正确地将 datetime64 值转换为 int64 (GH 37682)

  • Categorical 中错误地将 datetime 对象类型转换为 Timestamp 的错误 (GH 38878)

  • Timestamp 对象和 datetime64 对象之间的比较中存在一个错误,这些对象恰好在纳秒 datetime64 的实现边界之外 (GH 39221)

  • Timestamp.round()Timestamp.floor()Timestamp.ceil() 中存在一个错误,对于接近 Timestamp 实现边界值的情况 (GH 39244)

  • 在接近 Timedelta 实现边界值时,Timedelta.round()Timedelta.floor()Timedelta.ceil() 中的错误 (GH 38964)

  • date_range() 中的错误在某些情况下错误地创建了包含 NaTDatetimeIndex ,而不是引发 OutOfBoundsDatetime (GH 24124)

  • infer_freq() 中的错误未能正确推断出具有时区和跨越夏令时边界的 DatetimeIndex 的 ‘H’ 频率 (GH 39556)

  • SeriesDatetimeArrayTimedeltaArray 支持的错误有时无法将数组的 freq 设置为 None (GH 41425)

Timedelta#

  • np.timedelta64 对象构造 Timedelta 时,非纳秒单位的值超出 timedelta64[ns] 范围的错误 (GH 38965)

  • 在构建 TimedeltaIndex 时错误地接受 np.datetime64("NaT") 对象的错误 (GH 39462)

  • 从仅包含符号且无数字的输入字符串构造 Timedelta 时未能引发错误 (GH 39710)

  • TimedeltaIndexto_timedelta() 中的错误,当传递非纳秒 timedelta64 数组时,在转换为 timedelta64[ns] 时溢出不会引发 (GH 40008)

时区#

  • 不同 tzinfo 对象表示的 UTC 未被视为等效的错误 (GH 39216)

  • dateutil.tz.gettz("UTC") 中的错误未被识别为与其他表示UTC的tzinfo等效 (GH 39276)

Numeric#

转换#

  • Series.to_dict()orient='records' 的错误现在返回 Python 原生类型 (GH 25969)

  • 在转换类似日期时间(datetime64[ns]datetime64[ns, tz]timedelta64period)的数据类型时,Series.view()Index.view() 中的错误 (GH 39788)

  • 从空的 np.recarray 创建 DataFrame 时,原始数据类型未保留的错误 (GH 40121)

  • DataFrame 中的一个错误,在从 frozenset 构造时未能引发 TypeError (GH 40163)

  • Index 构建中存在一个错误,当数据无法转换为该数据类型时,会静默忽略传递的 dtype (GH 21311)

  • StringArray.astype() 中的错误,回退到 NumPy 并在转换为 dtype='categorical' 时引发 (GH 40450)

  • factorize() 中的一个错误,当给定一个数值类型的 NumPy dtype 低于 int64、uint64 和 float64 的数组时,唯一值没有保留其原始 dtype (GH 41132)

  • 在包含带有 ExtensionDtype 的类数组对象和 copy=True 的字典构造 DataFrame 时出现的错误,未能进行复制 (GH 38939)

  • 在将 Float64DType 作为输入时,qcut() 中的错误引发错误 (GH 40730)

  • DataFrameSeries 构造中存在一个错误,当使用 datetime64[ns] 数据和 dtype=object 时,结果是 datetime 对象而不是 Timestamp 对象 (GH 41599)

  • DataFrameSeries 在构造 timedelta64[ns] 数据和 dtype=object 时存在错误,导致生成 np.timedelta64 对象而不是 Timedelta 对象 (GH 41599)

  • 在给定一个二维对象类型的 np.ndarray 包含 PeriodInterval 对象时,构造 DataFrame 的错误,无法分别转换为 PeriodDtypeIntervalDtype (GH 41812)

  • 从列表和 PandasDtype 构建 Series 时出现的错误 (GH 39357)

  • range 对象创建 Series 时,超出 int64 数据类型范围的错误 (GH 30173)

  • 在从所有元组键的 dict 创建 Series 时出现错误,并且需要重新索引的 Index (GH 41707)

  • infer_dtype() 中未识别带有 Period 数据类型的 Series、Index 或数组的错误 (GH 23553)

  • infer_dtype() 中对一般 ExtensionArray 对象引发错误的错误。现在它将返回 "unknown-array" 而不是引发 (GH 37367)。

  • DataFrame.convert_dtypes() 中的一个错误在调用空 DataFrame 时错误地引发了一个 ValueError (GH 40393)

字符串#

Interval#

  • IntervalIndex.intersection()IntervalIndex.symmetric_difference() 中的 Bug,在与 CategoricalIndex 操作时总是返回 object-dtype (GH 38653, GH 38741)

  • IntervalIndex.intersection() 中的错误在至少一个 Index 对象有重复项且在另一个对象中也存在时返回重复项 (GH 38743)

  • IntervalIndex.union(), IntervalIndex.intersection(), IntervalIndex.difference(), 和 IntervalIndex.symmetric_difference() 现在会转换为适当的 dtype,而不是在与另一个具有不兼容 dtype 的 IntervalIndex 操作时引发 TypeError (GH 39267)

  • PeriodIndex.union(), PeriodIndex.intersection(), PeriodIndex.symmetric_difference(), PeriodIndex.difference() 现在在操作另一个具有不兼容dtype的 PeriodIndex 时会转换为object dtype,而不是引发 IncompatibleFrequency (GH 39306)

  • 当存在 NA 值时,IntervalIndex.is_monotonic()IntervalIndex.get_loc()IntervalIndex.get_indexer_for()IntervalIndex.__contains__() 中的错误 (GH 41831)

索引#

  • Index 不是单调的或 sort 设置为 False 时,Index.union()MultiIndex.union() 中的错误会删除重复的 Index 值 (GH 36289, GH 31326, GH 40862)

  • CategoricalIndex.get_indexer() 中的错误,未能当非唯一时引发 InvalidIndexError (GH 38372)

  • target 具有 CategoricalDtype 且索引和目标都包含 NA 值时,IntervalIndex.get_indexer() 中的 Bug (GH 41934)

  • 当输入通过布尔列表过滤并且要设置的值是维度较低的列表时,Series.loc() 中的错误引发了一个 ValueError (GH 20438)

  • 在向 DataFrame 插入许多新列时出现的错误,导致后续索引行为不正确 (GH 38380)

  • DataFrame.__setitem__() 中设置多个值到重复列时引发 ValueError 的错误 (GH 15695)

  • DataFrame.loc()Series.loc()DataFrame.__getitem__()Series.__getitem__() 中存在一个错误,对于非单调的 DatetimeIndex 字符串切片返回不正确的元素 (GH 33146)

  • DataFrame.reindex()Series.reindex() 中,带有时区感知的索引在指定 method="ffill"method="bfill" 以及 tolerance 时引发 TypeError 的错误 (GH 38566)

  • DataFrame.reindex() 中使用 datetime64[ns]timedelta64[ns] 时,当 fill_value 需要转换为对象类型时,错误地转换为整数 (GH 39755)

  • 在通过指定列和一个非空的 DataFrame 值设置一个空的 DataFrame 时,DataFrame.__setitem__() 中出现的错误会引发一个 ValueError (GH 38831)

  • DataFrame 有重复列时,DataFrame.loc.__setitem__() 中的错误在操作唯一列时引发 ValueError (GH 38521)

  • 在设置字典值时,DataFrame.iloc.__setitem__()DataFrame.loc.__setitem__() 中混合数据类型的错误 (GH 38335)

  • Series.loc.__setitem__()DataFrame.loc.__setitem__() 中存在一个错误,当提供一个布尔生成器时会引发 KeyError (GH 39614)

  • Series.iloc()DataFrame.iloc() 中的错误,当提供生成器时引发 KeyError (GH 39614)

  • DataFrame.__setitem__() 中的一个错误,当右侧是一个具有错误列数的 DataFrame 时,不会引发 ValueError (GH 38604)

  • Series.__setitem__() 中存在一个错误,当使用标量索引器设置 Series 时会引发 ValueError (GH 38303)

  • DataFrame.loc() 中存在一个错误,当用作输入的 DataFrame 只有一行时,会删除 MultiIndex 的级别 (GH 10521)

  • DataFrame.__getitem__()Series.__getitem__() 中的错误总是会在使用现有字符串进行切片时引发 KeyError,其中 Index 具有毫秒 (GH 33589)

  • 在将 timedelta64datetime64 值设置到数字 Series 时,无法转换为对象 dtype 的错误 (GH 39086, GH 39619)

  • 在将 Interval 值设置到 SeriesDataFrame 中时,由于 IntervalDtype 不匹配,错误地将新值转换为现有 dtype 的错误 (GH 39120)

  • 在将 datetime64 值设置到具有整数数据类型的 Series 时,错误地将 datetime64 值转换为整数 (GH 39266)

  • 在将 np.datetime64("NaT") 设置到具有 Datetime64TZDtypeSeries 中时,错误地将时区无知的值视为时区感知 (GH 39769)

  • Index.get_loc() 中存在一个错误,当 key=NaN 且指定了 methodIndex 中不存在 NaN 时,未引发 KeyError (GH 39382)

  • DatetimeIndex.insert() 中插入 np.datetime64("NaT") 到时区感知的索引时,错误地将无时区值视为有时区值 (GH 39769)

  • Index.insert() 中错误地引发问题,当设置一个新列时,该列无法在现有的 frame.columns 中保存,或在 Series.reset_index()DataFrame.reset_index() 中,而不是转换为兼容的 dtype (GH 39068)

  • RangeIndex.append() 中的一个错误,其中长度为1的单个对象被错误地连接 (GH 39401)

  • RangeIndex.astype() 中的错误,当转换为 CategoricalIndex 时,类别变成了 Int64Index 而不是 RangeIndex (GH 41263)

  • 在对象类型的 Series 中使用布尔索引器设置 numpy.timedelta64 值时存在错误 (GH 39488)

  • 在将数值设置到使用 atiat 的布尔型 Series 时,未能转换为对象型 dtype 的错误 (GH 39582)

  • 在尝试使用行切片索引并设置列表作为值时,DataFrame.__setitem__()DataFrame.iloc.__setitem__() 中的错误引发 ValueError (GH 40440)

  • MultiIndex 中,当键未找到且级别未完全指定时,DataFrame.loc() 中的错误不会引发 KeyError (GH 41170)

  • 当扩展轴中的索引包含重复项时,在 DataFrame.loc.__setitem__() 中设置-带扩展错误地引发错误 (GH 40096)

  • DataFrame.loc.__getitem__() 中存在一个错误,当至少有一个索引列具有浮点数据类型并且我们检索一个标量时,MultiIndex 会转换为浮点数 (GH 41369)

  • DataFrame.loc() 中的错误不正确地匹配非布尔索引元素 (GH 20432)

  • 在使用 np.nan 对带有 CategoricalIndexSeriesDataFrame 进行索引时,当存在 np.nan 键时,错误地引发 KeyError 的问题 (GH 41933)

  • ExtensionDtype 存在的情况下,Series.__delitem__() 中的错误导致不正确地转换为 ndarray (GH 40386)

  • 在使用 CategoricalIndex 时,DataFrame.at() 中的错误在传递整数键时返回不正确的结果 (GH 41846)

  • 如果索引器有重复项,DataFrame.loc() 中的错误会以错误的顺序返回 MultiIndex (GH 40978)

  • DataFrame.__setitem__() 中使用 str 子类作为列名与 DatetimeIndex 时引发 TypeError 的错误 (GH 37366)

  • PeriodIndex.get_loc() 中的错误,当给定一个频率不匹配的 Period 时未能引发 KeyError (GH 41670)

  • 在某些情况下,使用 UInt64Index 和负整数键时,Bug .loc.__getitem__ 会引发 OverflowError 而不是 KeyError,在其他情况下会环绕到正整数 (GH 41777)

  • 在某些情况下,Index.get_indexer() 中的错误未能对无效的 methodlimittolerance 参数引发 ValueError (GH 41918)

  • 当使用 TimedeltaIndexSeriesDataFrame 进行切片时,传递无效字符串会引发 ValueError 而不是 TypeError 的错误 (GH 41821)

  • Index 构造函数中的错误有时会静默忽略指定的 dtype (GH 38879)

  • Index.where() 行为现在镜像 Index.putmask() 行为,即 index.where(mask, other) 匹配 index.putmask(~mask, other) (GH 39412)

缺失#

MultiIndex#

  • DataFrame.drop() 中存在一个错误,当 MultiIndex 不是唯一的且未提供 level 时会引发 TypeError (GH 36293)

  • MultiIndex.intersection() 中的错误导致结果中 NaN 重复 (GH 38623)

  • MultiIndex.equals() 中的一个错误,在 MultiIndex 包含 NaN 时错误地返回 True,即使它们的顺序不同 (GH 38439)

  • MultiIndex.intersection() 中的错误,在与 CategoricalIndex 相交时总是返回一个空结果 (GH 38653)

  • MultiIndex.difference() 中的错误在索引包含不可排序条目时错误地引发 TypeError (GH 41915)

  • 在空 MultiIndex 上使用 MultiIndex.reindex() 时引发 ValueError 的错误,并且仅索引特定级别 (GH 41170)

  • MultiIndex.reindex() 中重新索引时,当对一个扁平的 Index 进行重新索引时引发 TypeError 的错误 (GH 41707)

I/O#

周期#

  • 比较 Period 对象或 Index, Series, 或 DataFrame 时,如果 PeriodDtype 不匹配,现在会像其他类型不匹配的比较一样,对于相等返回 False,对于不相等返回 True,并且在进行不等检查时会引发 TypeError (GH 39274)

绘图#

  • 在传递二维 ax 参数时,plotting.scatter_matrix() 中的错误引发 (GH 16253)

  • 当启用 Matplotlib 的 constrained_layout 时防止警告 (GH 25261)

  • DataFrame.plot() 中的错误在图例中显示了错误的颜色,如果函数被重复调用,并且有些调用使用了 yerr 而其他调用没有使用 (GH 39522)

  • 如果函数被重复调用,并且某些调用使用 secondary_y 而其他调用使用 legend=False,则 DataFrame.plot() 中的错误会在图例中显示错误的颜色 (GH 40044)

  • 当选择 dark_background 主题时,DataFrame.plot.box() 中的错误,图形的端盖或最小/最大标记不可见 (GH 40769)

分组/重采样/滚动#

重塑#

Sparse#

  • DataFrame.sparse.to_coo() 中存在一个错误,当列是一个没有 0 的数值 Index 时会引发 KeyError (GH 18414)

  • 当从整数类型转换为浮点类型时,SparseArray.astype()copy=False 情况下产生不正确的结果 (GH 34456)

  • SparseArray.max()SparseArray.min() 中的错误总是返回一个空结果 (GH 40921)

ExtensionArray#

Styler#

  • Styler 中的一个错误,其中方法中的 subset 参数对某些有效的 MultiIndex 切片引发了错误 (GH 33562)

  • Styler 渲染的 HTML 输出已经进行了一些小的调整,以支持 w3 的良好代码标准 (GH 39626)

  • Styler 中的一个错误,其中某些标题单元格缺少列类标识符,导致渲染的 HTML 缺失 (GH 39716)

  • Styler.background_gradient() 中的一个错误,其中文本颜色未正确确定 (GH 39888)

  • Styler.set_table_styles() 中的一个错误,其中 table_styles 参数的 CSS-选择器中的多个元素未正确添加 (GH 34061)

  • Styler 中的一个错误,从 Jupyter 复制时会丢失左上角的单元格并使标题错位 (GH 12147)

  • Styler.where 中的一个错误,其中 kwargs 没有传递给适用的可调用对象 (GH 40845)

  • Styler 中的一个错误导致 CSS 在多次渲染时重复 (GH 39395, GH 40334)

其他#

贡献者#

总共有251人为此版本贡献了补丁。名字旁边有“+”的人首次贡献了补丁。

  • Abhishek R +

  • Ada Draginda

  • Adam J. Stewart

  • Adam Turner +

  • Aidan Feldman +

  • Ajitesh Singh +

  • Akshat Jain +

  • Albert Villanova del Moral

  • Alexandre Prince-Levasseur +

  • Andrew Hawyrluk +

  • Andrew Wieteska

  • AnglinaBhambra +

  • Ankush Dua +

  • Anna Daglis

  • Ashlan Parker +

  • Ashwani +

  • Avinash Pancham

  • Ayushman Kumar +

  • BeanNan

  • Benoît Vinot

  • Bharat Raghunathan

  • Bijay Regmi +

  • Bobin Mathew +

  • Bogdan Pilyavets +

  • Brian Hulette +

  • Brian Sun +

  • Brock +

  • Bryan Cutler

  • Caleb +

  • Calvin Ho +

  • Chathura Widanage +

  • Chinmay Rane +

  • Chris Lynch

  • Chris Withers

  • Christos Petropoulos

  • Corentin Girard +

  • DaPy15 +

  • Damodara Puddu +

  • Daniel Hrisca

  • Daniel Saxton

  • DanielFEvans

  • Dare Adewumi +

  • Dave Willmer

  • David Schlachter +

  • David-dmh +

  • Deepang Raval +

  • Doris Lee +

  • Dr. Jan-Philip Gehrcke +

  • DriesS +

  • Dylan Percy

  • Erfan Nariman

  • Eric Leung

  • EricLeer +

  • Eve

  • Fangchen Li

  • Felix Divo

  • Florian Jetter

  • Fred Reiss

  • GFJ138 +

  • Gaurav Sheni +

  • Geoffrey B. Eisenbarth +

  • Gesa Stupperich +

  • Griffin Ansel +

  • Gustavo C. Maciel +

  • Heidi +

  • Henry +

  • Hung-Yi Wu +

  • Ian Ozsvald +

  • Irv Lustig

  • Isaac Chung +

  • Isaac Virshup

  • JHM Darbyshire (MBP) +

  • JHM Darbyshire (iMac) +

  • Jack Liu +

  • James Lamb +

  • Jeet Parekh

  • Jeff Reback

  • Jiezheng2018 +

  • Jody Klymak

  • Johan Kåhrström +

  • John McGuigan

  • Joris Van den Bossche

  • Jose

  • JoseNavy

  • Josh Dimarsky

  • Josh Friedlander

  • Joshua Klein +

  • Julia Signell

  • Julian Schnitzler +

  • Kaiqi Dong

  • Kasim Panjri +

  • Katie Smith +

  • Kelly +

  • Kenil +

  • Keppler, Kyle +

  • Kevin Sheppard

  • Khor Chean Wei +

  • Kiley Hewitt +

  • Larry Wong +

  • Lightyears +

  • Lucas Holtz +

  • Lucas Rodés-Guirao

  • Lucky Sivagurunathan +

  • Luis Pinto

  • Maciej Kos +

  • Marc Garcia

  • Marco Edward Gorelli +

  • Marco Gorelli

  • MarcoGorelli +

  • Mark Graham

  • Martin Dengler +

  • Martin Grigorov +

  • Marty Rudolf +

  • Matt Roeschke

  • Matthew Roeschke

  • Matthew Zeitlin

  • Max Bolingbroke

  • Maxim Ivanov

  • Maxim Kupfer +

  • Mayur +

  • MeeseeksMachine

  • Micael Jarniac

  • Michael Hsieh +

  • Michel de Ruiter +

  • Mike Roberts +

  • Miroslav Šedivý

  • Mohammad Jafar Mashhadi

  • Morisa Manzella +

  • Mortada Mehyar

  • Muktan +

  • Naveen Agrawal +

  • Noah

  • Nofar Mishraki +

  • Oleh Kozynets

  • Olga Matoula +

  • Oli +

  • Omar Afifi

  • Omer Ozarslan +

  • Owen Lamont +

  • Ozan Öğreden +

  • Pandas Development Team

  • Paolo Lammens

  • Parfait Gasana +

  • Patrick Hoefler

  • Paul McCarthy +

  • Paulo S. Costa +

  • Pav A

  • Peter

  • Pradyumna Rahul +

  • Punitvara +

  • QP Hou +

  • Rahul Chauhan

  • Rahul Sathanapalli

  • Richard Shadrach

  • Robert Bradshaw

  • Robin to Roxel

  • Rohit Gupta

  • Sam Purkis +

  • Samuel GIFFARD +

  • Sean M. Law +

  • Shahar Naveh +

  • ShaharNaveh +

  • Shiv Gupta +

  • Shrey Dixit +

  • Shudong Yang +

  • Simon Boehm +

  • Simon Hawkins

  • Sioned Baker +

  • Stefan Mejlgaard +

  • Steven Pitman +

  • Steven Schaerer +

  • Stéphane Guillou +

  • TLouf +

  • Tegar D Pratama +

  • Terji Petersen

  • Theodoros Nikolaou +

  • Thomas Dickson

  • Thomas Li

  • Thomas Smith

  • Thomas Yu +

  • ThomasBlauthQC +

  • Tim Hoffmann

  • Tom Augspurger

  • Torsten Wörtwein

  • Tyler Reddy

  • UrielMaD

  • Uwe L. Korn

  • Venaturum +

  • VirosaLi

  • Vladimir Podolskiy

  • Vyom Pathak +

  • WANG Aiyong

  • Waltteri Koskinen +

  • Wenjun Si +

  • William Ayd

  • Yeshwanth N +

  • Yuanhao Geng

  • Zito Relova +

  • aflah02 +

  • arredond +

  • attack68

  • cdknox +

  • chinggg +

  • fathomer +

  • ftrihardjo +

  • github-actions[bot] +

  • gunjan-solanki +

  • guru kiran

  • hasan-yaman

  • i-aki-y +

  • jbrockmendel

  • jmholzer +

  • jordi-crespo +

  • jotasi +

  • jreback

  • juliansmidek +

  • kylekeppler

  • lrepiton +

  • lucasrodes

  • maroth96 +

  • mikeronayne +

  • mlondschien

  • moink +

  • morrme

  • mschmookler +

  • mzeitlin11

  • na2 +

  • nofarmishraki +

  • partev

  • patrick

  • ptype

  • realead

  • rhshadrach

  • rlukevie +

  • rosagold +

  • saucoide +

  • sdementen +

  • shawnbrown

  • sstiijn +

  • stphnlyd +

  • sukriti1 +

  • taytzehao

  • theOehrly +

  • theodorju +

  • thordisstella +

  • tonyyyyip +

  • tsinggggg +

  • tushushu +

  • vangorade +

  • vladu +

  • wertha +