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 不包含在组键中。

按键排序#

我们在 DataFrameSeries 的排序方法中添加了一个 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#

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, 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 仍将引入与之前相同的包。

其他增强功能#

值得注意的错误修复#

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

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 的类型引发 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 的整数进行索引,当整数类型的第一级中不存在一个或多个这些整数键时,错误地未能引发 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_equaltesting.assert_series_equal 中添加了 check_freq 参数#

check_freq 参数在 pandas 1.1.0 中被添加到 testing.assert_frame_equal()testing.assert_series_equal() 中,并且默认为 Truetesting.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 的情况下,将在未来版本中包含 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)

性能提升#

错误修复#

Categorical#

  • Categorical.take() 传递一个无效的 fill_value 会引发 ValueError 而不是 TypeError (GH 33660)

  • 将包含缺失值和整数类别的 Categorical 与浮点数据类型的列在操作中如 concat()append() 结合,现在将导致浮点列而不是对象数据类型列 (GH 33607)

  • 一个错误,其中 merge() 无法在非唯一分类索引上进行连接 (GH 28189)

  • 当将分类数据传递给带有 dtype=objectIndex 构造函数时,错误地返回了一个 CategoricalIndex 而不是 object-dtype 的 Index (GH 32167)

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

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

  • Categorical 的 repr 没有区分 intstr (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)

  • 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-dtype 输入 (GH 32668)

  • DatetimeIndex.searchsorted() 中的错误,不接受 listSeries 作为其参数 (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数组构建 SeriesIndex 时存在一个错误,该数组具有非ns分辨率,当在时间戳范围内时,它被转换为对象dtype,而不是强制转换为 datetime64[ns] dtype (GH 34843)。

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

  • 当将包含标量 tz-aware TimestampSeries 追加到空的 DataFrame 时,出现了一个错误,导致生成了一个对象列,而不是 datetime64[ns, tz] 数据类型 (GH 35038)

  • OutOfBoundsDatetime 在时间戳超出实现边界时发出改进的错误消息。(GH 32967)

  • 当没有定义规则时,AbstractHolidayCalendar.holidays() 中的错误 (GH 31415)

  • 在比较 Tick 时,当与类似 timedelta 的对象进行比较时引发 TypeError 的错误 (GH 34088)

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

Timedelta#

时区#

  • infer_datetime_format=True 的情况下,to_datetime() 中的时区名称(例如 UTC)无法正确解析的错误 (GH 33133)

Numeric#

转换#

  • 从大端 datetime64 dtype 的 NumPy 数组构造 Series 时出现的错误 (GH 29684)

  • Timedelta 构造中使用大纳秒关键字值的错误 (GH 32402)

  • DataFrame 构造中存在一个错误,其中集合会被重复而不是引发 (GH 32582)

  • DataFrame 构造函数不再接受 DataFrame 对象的列表。由于 NumPy 的更改,DataFrame 对象现在被一致地视为 2D 对象,因此 DataFrame 对象的列表被认为是 3D 的,并且不再被 DataFrame 构造函数接受(GH 32289)。

  • 在用列表初始化 DataFrame 时,为 MultiIndex 分配嵌套列表给 columns 时出现的错误 (GH 32173)

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

字符串#

  • 在将“字符串”数据类型转换为可空整数数据类型时,astype() 方法中的错误 (GH 32450)。

  • 修复了在 StringArrayStringDtype 类型的 Series 上取 minmax 时会引发的问题。(GH 31746)

  • Series.str.cat() 中存在一个错误,当其他项为 Index 类型时返回 NaN 输出 (GH 33425)

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

Interval#

  • IntervalArray 中存在一个错误,允许在设置值时更改底层数据 (GH 32782)

索引#

缺失#

  • 在空的 Series 上调用 fillna() 现在会正确返回一个浅拷贝的对象。该行为现在与 IndexDataFrame 和非空的 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() 现在使用正确的轴约定。以前沿列插值会导致沿索引插值,反之亦然。此外,使用方法 padffillbfillbackfill 插值与使用这些方法与 DataFrame.fillna() 相同(GH 12918GH 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
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() 现在会在 headerprefix 参数都不为 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=Nonecomment 关键字组合时引发 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() where Timedelta objects would not be serialized correctly with date_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文件,当设置了 lineschunksize 时。

  • 在使用 MySQL 读取包含 -np.inf 条目的 DataFrame 时,DataFrame.to_sql() 中的错误现在会有更明确的 ValueError (GH 34431)

  • 读取*函数未解压大写文件扩展名的问题 (GH 35164)

  • read_excel() 中的一个错误,当 header=None 并且 index_collist 形式给出时会引发 TypeError (GH 31783)

  • MultiIndex 中使用日期时间值作为标题时,read_excel() 中的错误 (GH 34748)

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

  • DataFrame.to_records() 中的错误不正确地丢失了时区感知 datetime64 列中的时区信息 (GH 32535)

绘图#

GroupBy/重采样/滚动#

Reshaping#

Sparse#

  • 从时区感知的dtype创建 SparseArray 时,会在删除时区信息之前发出警告,而不是静默地执行此操作 (GH 32501)

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

  • Series.sum() 中使用 SparseArray 引发了一个 TypeError (GH 25777)

  • 包含全稀疏 SparseArrayDataFrame 在通过类列表索引时填充 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 构造中使用 EA dtype 和索引但没有数据或标量数据失败的问题 (GH 26469)

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

  • DataFrame 列设置为标量扩展类型时被认为是对象类型而不是扩展类型的问题 (GH 34832)

  • 修复了 IntegerArray.astype() 中的错误,以正确复制掩码 (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 +