1.1.0 版本新特性 (2020 年 7 月 28 日)#

以下是 pandas 1.1.0 中的更改。有关包括 pandas 其他版本在内的完整更改日志,请参阅发布说明

改进#

`loc` 引发的 `KeyError` 现在会指定缺失的标签#

此前,如果 .loc 调用缺少标签,会引发 KeyError,并指出不再支持此操作。

现在,错误消息中还会包含一个缺失标签的列表(最多 10 项,显示宽度 80 字符)。请参阅 GH 34272

现在所有 `dtype` 都可以转换为 `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>
Length: 3, 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>
Length: 3, 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, Length: 13, dtype: int64

In [12]: ser.loc["May 2015"]
Out[12]: 
2015-05-26    17
Freq: D, Length: 1, 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

[5 rows x 3 columns]
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

[5 rows x 3 columns]
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

[2 rows x 4 columns]

更多详细信息请参阅用户指南

允许 groupby 键中包含 NA 值#

groupby 中,我们为 DataFrame.groupby()Series.groupby() 添加了 dropna 关键字,以允许分组键中包含 NA 值。如果用户希望在 groupby 键中包含 NA 值,可以将 dropna 设置为 False。为了保持向后兼容性,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

[4 rows x 3 columns]
# 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

[2 rows x 2 columns]

# 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

[3 rows x 2 columns]

参数 dropna 的默认设置为 True,这意味着 NA 不会包含在分组键中。

带键的排序#

我们为 DataFrameSeries 的排序方法(包括 DataFrame.sort_values()DataFrame.sort_index()Series.sort_values()Series.sort_index())添加了一个 key 参数。在执行排序之前,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
Length: 3, dtype: object
In [27]: s.sort_values()
Out[27]: 
2    B
0    C
1    a
Length: 3, dtype: object

请注意,这会先按大写字母排序。如果我们应用 Series.str.lower() 方法,我们会得到

In [28]: s.sort_values(key=lambda x: x.str.lower())
Out[28]: 
1    a
2    B
0    C
Length: 3, 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

[6 rows x 2 columns]
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

[6 rows x 2 columns]

更多详细信息请参阅 DataFrame.sort_values()Series.sort_values()sort_index() 中的示例和文档。

Timestamp 构造函数中支持 fold 参数#

Timestamp: 现在支持仅关键字参数 fold,这与父类 datetime.datetime 类似,并遵循 PEP 495。它支持将 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=True 将它们转换为 UTC。这将返回一个时区为 UTC 的 DatetimeIndex,而不是在未设置 utc=True 时返回 object dtype 的 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[ns, 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` 参数#

GrouperDataFrame.resample() 现在支持 originoffset 参数。它允许用户控制调整分组的时间戳。(GH 31809)

分组的箱体根据时间序列起始点的当天开始时间进行调整。这对于以天为倍数(如 30D)或能被天整除(如 90s1min)的频率非常有效。但对于不符合此标准的某些频率,它可能会造成不一致。现在,您可以使用参数 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, Length: 9, dtype: int64

使用默认行为 'start_day' 的重采样(origin 为 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, Length: 5, 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, Length: 5, dtype: int64

使用固定 origin 的重采样

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, Length: 5, 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, Length: 4, dtype: int64

如果需要,您可以使用参数 offset(一个 Timedelta)来调整箱体,它将被添加到默认的 origin

有关完整示例,请参阅:使用 origin 或 offset 调整箱体的起始点

`fsspec` 现在用于文件系统处理#

对于本地文件系统以外的文件系统读写以及从 HTTP(S) 读取,将使用可选依赖项 fsspec 来调度操作 (GH 33452)。这对于 S3 和 GCS 存储(此前已支持)将提供不变的功能,但也将新增对其他几种存储实现的支持,例如 Azure Data Lake 和 Blob、SSH、FTP、Dropbox 和 GitHub。有关文档和功能,请参阅 fsspec 文档

与 S3 和 GCS 交互的现有功能不会受到此更改的影响,因为 fsspec 仍将引入与以前相同的包。

其他改进#

重要错误修复#

这些错误修复可能会带来显著的行为更改。

`MultiIndex.get_indexer` 正确解释 `method` 参数#

这会将 MultiIndex.get_indexer() 使用 method='backfill'method='pad' 时的行为恢复到 pandas 0.23.0 之前的行为。特别是,MultiIndex 被视为元组列表,填充或回填是根据这些元组列表的顺序进行的 (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_2df 进行重索引并使用 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

[6 rows x 1 columns]

以及使用 mi_2df 进行重索引并使用 method='pad' 时的差异可以在这里看到:

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

[6 rows x 1 columns]

基于标签的查找失败始终引发 `KeyError`#

标签查找 series[key]series.loc[key]frame.loc[key] 以前会根据键类型和 Index 类型引发 KeyErrorTypeError。现在它们始终引发 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 的第一层为整数 dtype 时,使用整数进行索引在索引的第一层中不存在一个或多个整数键时错误地未能引发 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 的行顺序#

执行右合并时,DataFrame.merge() 现在会保留右侧 DataFrame 的行顺序 (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

[2 rows x 2 columns]

In [60]: right_df
Out[60]: 
    animal  max_speed
0  quetzal         80
1      pig         11

[2 rows x 2 columns]

旧行为:

>>> 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

[2 rows x 2 columns]

当某些列不存在时,为 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

[3 rows x 2 columns]

旧行为:

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

[3 rows x 3 columns]

`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

[4 rows x 2 columns]

旧行为:

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

[2 rows x 1 columns]

以前,使用 DataFrame.groupby() 配合 as_index=False 和函数 idxmaxidxminmadnuniquesemskewstd 时,会修改分组列。现在,分组列保持不变,与其他聚合操作保持一致。(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

[2 rows x 2 columns]

以前,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

[2 rows x 2 columns]

`DataFrameGroupby.agg()` 在 `as_index=False` 且重命名列时丢失结果#

此前,当 DataFrameGroupby.agg()as_index 选项设置为 False 并且结果列被重新标记时,会丢失结果列。在这种情况下,结果值会被之前的索引替换 (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

[6 rows x 2 columns]

旧行为:

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

[3 rows x 2 columns]

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, Length: 2, dtype: int64
a    2
b    6
Name: 1, Length: 2, dtype: int64
Out[78]: 
   a  b
0  1  3
1  2  6

[2 rows x 2 columns]

向后不兼容的 API 更改#

为 `testing.assert_frame_equal` 和 `testing.assert_series_equal` 添加了 `check_freq` 参数#

在 pandas 1.1.0 中,check_freq 参数已添加到 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)。如果安装,我们现在要求:

最低版本

必需

已更改

numpy

1.15.4

X

X

pytz

2015.4

X

python-dateutil

2.7.3

X

X

bottleneck

1.2.1

numexpr

2.6.2

pytest (dev)

4.0.2

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

最低版本

已更改

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)。

  • 未来版本中,使用 numeric_only=NoneDataFrame.mean()DataFrame.median() 将包含 datetime64datetime64tz 列 (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)。

  • groupby() 中的 squeeze 关键字已弃用,并将在未来版本中移除 (GH 32380)

  • 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)

性能改进#

错误修复#

类别型#

  • 将无效的 fill_value 传递给 Categorical.take() 会引发 ValueError 而非 TypeError (GH 33660)

  • 将包含整数类别且包含缺失值的 Categorical 与浮点数据类型列在 concat()append() 等操作中合并时,现在将生成浮点列而不是对象数据类型列 (GH 33607)

  • 修复了 merge() 无法在非唯一类别索引上连接的错误 (GH 28189)

  • 修复了将类别数据与 dtype=object 一起传递给 Index 构造函数时,错误地返回 CategoricalIndex 而非对象数据类型 Index 的错误 (GH 32167)

  • 修复了当任一元素缺失时,Categorical 比较运算符 __ne__ 错误地评估为 False 的错误 (GH 32276)

  • Categorical.fillna() 现在接受 Categorical other 参数 (GH 32420)

  • CategoricalRepr 没有区分 intstr (GH 33676)

日期时间类型#

  • 将除 int64 以外的整数数据类型传递给 np.array(period_index, dtype=...) 现在将引发 TypeError,而不是错误地使用 int64 (GH 32255)

  • 如果轴不是 PeriodIndexSeries.to_timestamp() 现在会引发 TypeError。以前会引发 AttributeError (GH 33327)

  • 如果轴不是 DatetimeIndexSeries.to_period() 现在会引发 TypeError。以前会引发 AttributeError (GH 33327)

  • Period 不再接受元组作为 freq 参数 (GH 34658)

  • 修复了 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)

  • 当缺少年、月或日时,Timestamp 曾引发令人困惑的错误消息 (GH 31200)

  • 修复了 DatetimeIndex 构造函数错误地接受 bool 数据类型输入的错误 (GH 32668)

  • 修复了 DatetimeIndex.searchsorted() 不接受 listSeries 作为其参数的错误 (GH 32762)

  • 修复了传递字符串 SeriesPeriodIndex() 引发错误的错误 (GH 26109)

  • 修复了 Timestamp 算术中,当添加或减去具有 timedelta64 数据类型的 np.ndarray 时的错误 (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 数据类型的值被静默转换的错误 (GH 33717)

  • 修复了从 Period 中减去 TimedeltaIndex 时,在某些应成功的情况下错误地引发 TypeError,在某些应引发 TypeError 的情况下引发 IncompatibleFrequency 的错误 (GH 33883)

  • 修复了从具有非纳秒分辨率的只读 NumPy 数组构造 SeriesIndex 时,错误地转换为对象数据类型,而不是在时间戳范围内强制转换为 datetime64[ns] 数据类型的错误 (GH 34843)。

  • Perioddate_range()period_range()pd.tseries.frequencies.to_offset() 中的 freq 关键字不再允许元组,请改用字符串 (GH 34703)

  • 修复了 DataFrame.append() 中的错误,当将包含标量时区感知 TimestampSeries 追加到空 DataFrame 时,结果是对象列而不是 datetime64[ns, tz] 数据类型 (GH 35038)

  • 当时间戳超出实现范围时,OutOfBoundsDatetime 会发出改进的错误消息。 (GH 32967)

  • 修复了 AbstractHolidayCalendar.holidays() 在未定义规则时的错误 (GH 31415)

  • 修复了 Tick 比较中,与 timedelta-like 对象比较时引发 TypeError 的错误 (GH 34088)

  • 修复了 Tick 乘法中,乘以浮点数时引发 TypeError 的错误 (GH 34486)

时间差#

时区#

  • 修复了 to_datetime()infer_datetime_format=True 时,时区名称(例如 UTC)无法正确解析的错误 (GH 33133)

数值型#

转换#

  • 修复了从具有大端 datetime64 数据类型的 NumPy 数组构造 Series 时的错误 (GH 29684)

  • 修复了构造 Timedelta 时,纳秒关键字值过大引发的错误 (GH 32402)

  • 修复了 DataFrame 构造中,集合会被复制而不是引发错误的错误 (GH 32582)

  • DataFrame 构造函数不再接受 DataFrame 对象列表。由于 NumPy 的更改,DataFrame 对象现在始终被视为二维对象,因此 DataFrame 对象列表被视为三维,不再被 DataFrame 构造函数接受 (GH 32289)。

  • 修复了 DataFrame 中,使用列表初始化框架并为 MultiIndex 分配带有嵌套列表的 columns 时的错误 (GH 32173)

  • 创建新索引时,改进了列表无效构造的错误消息 (GH 35190)

字符串#

  • 修复了 astype() 方法中,将“string”数据类型数据转换为可为空整数数据类型时的错误 (GH 32450)。

  • 修复了当对 StringArrayStringDtype 类型的 Seriesminmax 时会引发错误的问题。 (GH 31746)

  • 修复了 Series.str.cat() 在其他具有 Index 类型时返回 NaN 输出的错误 (GH 33425)

  • pandas.api.dtypes.is_string_dtype() 不再错误地将类别序列识别为字符串。

区间#

  • 修复了 IntervalArray 错误地允许在设置值时更改底层数据的错误 (GH 32782)

索引#

缺失值#

  • 对空 Series 调用 fillna() 现在正确返回一个浅拷贝对象。该行为现在与 IndexDataFrame 和非空 Series 一致 (GH 32543)。

  • 修复了 Series.replace() 中的错误,当参数 to_replace 为字典/列表类型并用于包含 <NA>Series 时会引发 TypeError。该方法现在通过在替换比较时忽略 <NA> 值来处理此问题 (GH 32621)

  • 修复了 any()all() 在使用可为空布尔数据类型且 skipna=False 时,对于所有 False 或所有 True 值错误地返回 <NA> 的错误 (GH 33253)

  • 澄清了关于使用 method=akima 进行插值的文档。参数 der 必须是标量或 None (GH 33426)

  • DataFrame.interpolate() 现在使用正确的轴约定。此前,沿列进行插值会导致沿索引进行插值,反之亦然。此外,使用 padffillbfillbackfill 方法进行插值与使用 DataFrame.fillna() 的这些方法相同 (GH 12918, GH 29146)

  • 修复了 DataFrame.interpolate() 在对具有字符串类型列名的 DataFrame 调用时会抛出 ValueError 的 bug。该方法现在独立于列名的类型 (GH 33956)

  • 现在可以将 NA 传递到使用格式规范的格式字符串中。例如,"{:.1f}".format(pd.NA) 之前会引发 ValueError,但现在会返回字符串 "<NA>" (GH 34740)

  • 修复了 Series.map() 在无效的 na_action 时未引发错误的 bug (GH 32815)

多重索引#

  • DataFrame.swaplevels() 现在在轴不是 MultiIndex 时会引发 TypeError。此前会引发 AttributeError (GH 31126)

  • 修复了 Dataframe.loc() 在与 MultiIndex 一起使用时存在的 bug。返回的值与给定输入值的顺序不一致 (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

[4 rows x 1 columns]
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 时存在的 bug。参数 return-indexers 被忽略 (GH 34074)

输入/输出#

  • set 作为 names 参数传递给 pandas.read_csv()pandas.read_table()pandas.read_fwf() 将引发 ValueError: Names should be an ordered collection. (GH 34946)

  • 修复了当 display.precision 为零时打印输出中的 bug (GH 20359)

  • 修复了 read_json() 在 json 包含大数字字符串时发生整数溢出的 bug (GH 30320)

  • 当参数 headerprefix 都不为 None 时,read_csv() 现在将引发 ValueError (GH 27394)

  • 修复了 DataFrame.to_json()path_or_buf 是 S3 URI 时引发 NotFoundError 的 bug (GH 28375)

  • 修复了 DataFrame.to_parquet() 覆盖 pyarrow 的 coerce_timestamps 默认值的 bug;遵循 pyarrow 的默认值允许使用 version="2.0" 写入纳秒时间戳 (GH 31652)。

  • 修复了 read_csv()sep=Nonecomment 关键字结合使用时引发 TypeError 的 bug (GH 31396)

  • 修复了 HDFStore 的 bug,该 bug 导致在 Python 3 中读取 Python 2 写入的固定格式 DataFrame 时,datetime64 列的 dtype 被设置为 int64 (GH 31750)

  • read_sas() 现在可以处理大于 Timestamp.max 的日期和日期时间,将它们作为 datetime.datetime 对象返回 (GH 20927)

  • 修复了 DataFrame.to_json()Timedelta 对象在 date_format="iso" 时无法正确序列化的 bug (GH 28256)

  • parse_dates 中传递的列名在 Dataframe 中缺失时,read_csv() 将引发 ValueError (GH 31251)

  • 修复了 read_excel() 中,当 UTF-8 字符串包含高位代理时会导致分段冲突的 bug (GH 23809)

  • 修复了 read_csv() 在空文件上导致文件描述符泄漏的 bug (GH 31488)

  • 修复了 read_csv() 中当头部和数据行之间存在空行时导致段错误的 bug (GH 28071)

  • 修复了 read_csv() 在权限问题上引发误导性异常的 bug (GH 23784)

  • 修复了 read_csv()header=None 且有两个额外数据列时引发 IndexError 的 bug

  • 修复了 read_sas() 在读取 Google Cloud Storage 文件时引发 AttributeError 的 bug (GH 33069)

  • 修复了 DataFrame.to_sql() 在保存超出范围的日期时引发 AttributeError 的 bug (GH 26761)

  • 修复了 read_excel() 未正确处理 OpenDocument 文本单元格中多个嵌入空格的 bug (GH 32207)

  • 修复了 read_json() 在将布尔值 list 读取到 Series 时引发 TypeError 的 bug (GH 31464)

  • 修复了 pandas.io.json.json_normalize()record_path 指定的位置未指向数组的 bug (GH 26284)

  • 当加载不支持的 HDF 文件时,pandas.read_hdf() 现在有更明确的错误消息 (GH 9539)

  • 修复了 read_feather() 在读取 s3 或 http 文件路径时引发 ArrowIOError 的 bug (GH 29055)

  • 修复了 to_excel() 无法处理列名 render 并引发 KeyError 的 bug (GH 34331)

  • 修复了 execute() 在 SQL 语句包含 % 字符且没有参数时,对某些 DB-API 驱动程序引发 ProgrammingError 的 bug (GH 34211)

  • 修复了 StataReader() 的 bug,该 bug 导致在使用迭代器读取数据时,分类变量具有不同的 dtypes (GH 31544)

  • HDFStore.keys() 现在有一个可选的 include 参数,允许检索所有原生 HDF5 表名 (GH 29916)

  • 当传递意外的关键字参数时,read_csv()read_table() 引发的 TypeError 异常显示为 parser_f (GH 25648)

  • 修复了 read_excel() 对于 ODS 文件删除 0.0 值的 bug (GH 27222)

  • 修复了 ujson.encode() 在数字大于 sys.maxsize 时引发 OverflowError 的 bug (GH 34395)

  • 修复了 HDFStore.append_to_multiple() 在设置 min_itemsize 参数时引发 ValueError 的 bug (GH 11238)

  • 修复了 create_table() 现在在输入中未在 data_columns 中指定 column 参数时会引发错误的 bug (GH 28156)

  • 当设置了 lineschunksize 时,read_json() 现在可以从文件 URL 读取按行分隔的 json 文件。

  • 修复了 DataFrame.to_sql() 在使用 MySQL 读取包含 -np.inf 条目的 DataFrame 时会引发更明确的 ValueError 的 bug (GH 34431)

  • 修复了 read_* 函数不会解压大写文件扩展名的 bug (GH 35164)

  • 修复了 read_excel()header=Noneindex_collist 形式给出时引发 TypeError 的 bug (GH 31783)

  • 修复了 read_excel()MultiIndex 中使用日期时间值作为头部时存在的 bug (GH 34748)

  • read_excel() 不再接受 **kwds 参数。这意味着传递关键字参数 chunksize 现在会引发 TypeError (此前引发 NotImplementedError),而传递关键字参数 encoding 现在会引发 TypeError (GH 34464)

  • 修复了 DataFrame.to_records() 在时区感知 datetime64 列中错误地丢失时区信息的 bug (GH 32535)

绘图#

分组/重采样/滚动#

重塑#

稀疏数据#

  • 从时区感知 dtype 创建 SparseArray 将在删除时区信息之前发出警告,而不是静默删除 (GH 32501)

  • 修复了 arrays.SparseArray.from_spmatrix() 错误读取 scipy 稀疏矩阵的 bug (GH 31991)

  • 修复了 Series.sum()SparseArray 结合使用时引发 TypeError 的 bug (GH 25777)

  • 修复了包含完全稀疏的 SparseArray (填充了 NaN) 的 DataFrame 在按列表索引时出现的 bug (GH 27781, GH 29563)

  • SparseDtype 的 repr 现在包含其 fill_value 属性的 repr。此前它使用 fill_value 的字符串表示形式 (GH 34352)

  • 修复了空 DataFrame 无法转换为 SparseDtype 的 bug (GH 33113)

  • 修复了 arrays.SparseArray() 在使用可迭代对象索引稀疏 DataFrame 时返回不正确类型的 bug (GH 34526, GH 34540)

扩展数组#

  • 修复了 Series.value_counts() 在 Int64 dtype 空输入时会引发错误的 bug (GH 33317)

  • 修复了 concat() 在连接列不重叠的 DataFrame 对象时导致 object-dtype 列而不是保留扩展 dtype 的 bug (GH 27692, GH 33027)

  • 修复了 StringArray.isna()pandas.options.mode.use_inf_as_na 设置为 True 时对 NA 值返回 False 的 bug (GH 33655)

  • 修复了使用 EA dtype 和索引但无数据或标量数据构造 Series 失败的 bug (GH 26469)

  • 修复了导致 Series.__repr__() 对元素是多维数组的扩展类型崩溃的 bug (GH 33770)。

  • 修复了 Series.update()ExtensionArray dtypes 包含缺失值时会引发 ValueError 的 bug (GH 33980)

  • 修复了 StringArray.memory_usage() 未实现时的 bug (GH 33963)

  • 修复了 DataFrameGroupBy() 会忽略可空布尔 dtypes 聚合的 min_count 参数的 bug (GH 34051)

  • 修复了 DataFrame 构造函数在 dtype='string' 时会失败的 bug (GH 27953, GH 33623)

  • 修复了 DataFrame 列设置为标量扩展类型时被视为对象类型而不是扩展类型的 bug (GH 34832)

  • 修复了 IntegerArray.astype() 未能正确复制掩码的 bug (GH 34931)。

其他#

贡献者#

共有 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 +