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

以下是 pandas 1.1.0 的更改。请参阅 发布说明 以获取包含其他 pandas 版本的完整更新日志。

增强功能#

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

以前,如果 .loc 调用中缺少标签,会引发 KeyError,说明这已不再支持。

现在错误消息中也会包含缺失标签的列表(最多 10 项,显示宽度 80 字符)。详见 GH 34272

所有 dtype 现在都可以转换为 StringDtype#

以前,通常只有当数据本身已经是 str 或类似 nan 的数据时,才能声明或转换为 StringDtype (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 key 中使用 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 的排序方法中添加了一个 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
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: 现在根据 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=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)。

分组的 bin 是根据时间序列起始点的一天的开始时间进行调整的。这对于以一天为倍数(例如 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)调整 bin,该偏移量将添加到默认的 origin 中。

完整示例请参阅:使用 origin 或 offset 调整 bin 的起始点

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

对于读写本地以外的文件系统以及从 HTTP(S) 读取,可选依赖项 fsspec 将用于分派操作 (GH 33452)。这将为 S3 和 GCS 存储提供不变的功能(这些已经得到支持),同时还增加了对其他几种存储实现的支援,例如 Azure Datalake 和 Blob、SSH、FTP、dropbox 和 github。有关文档和功能,请参阅 fsspec 文档

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

其他增强功能#

重要的 Bug 修复#

这些 Bug 修复可能会带来值得注意的行为变化。

MultiIndex.get_indexer 正确解释 method 参数#

这恢复了 MultiIndex.get_indexer() 使用 method='backfill'method='pad' 的行为,使其与 pandas 0.23.0 之前的行为一致。特别是,MultiIndex 被视为元组列表,填充(padding)或回填(backfilling)是根据这些元组列表的顺序进行的 (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 进行 reindexing 并使用 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 进行 reindexing 并使用 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] 以前会根据 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() 如果传递了不兼容的 key,将引发 TypeError 而不是 ValueError;如果传递了缺失的 key,将引发 KeyError,与 .loc[] 的行为一致 (GH 31722)。

MultiIndex 上整数查找失败时引发 KeyError#

使用具有整型 dtype 第一层的 MultiIndex 进行整数索引时,当一个或多个整数 key 不存在于索引的第一层时,以前错误地没有引发 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() 现在在执行 right 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 并重命名列时丢失结果#

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

[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 更改#

check_freq 参数添加到 testing.assert_frame_equaltesting.assert_series_equal#

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)。如果安装了,我们现在要求最低版本为

最低版本

必需

已更改

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

更多信息请参阅 DependenciesOptional dependencies

开发变更#

  • Cython 的最低版本现在是最新的 Bug 修复版本 (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)

性能改进#

Bug 修复#

Categorical#

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

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

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

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

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

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

  • Categorical 的表示形式未能区分 intstr (GH 33676)

日期时间类型#

  • 现在,将 int64 以外的整数 dtype 传递给 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 中的一个 Bug,即从模糊的 epoch 时间构造 Timestamp 并再次调用构造函数会改变 Timestamp.value() 属性 (GH 24329)

  • DatetimeArray.searchsorted()TimedeltaArray.searchsorted()PeriodArray.searchsorted() 未识别非 pandas 标量,并错误地引发 ValueError 而非 TypeError (GH 30950)

  • 修复了 Timestamp 中的一个 Bug,即在使用 dateutil 时区构造 Timestamp 时,如果时间在夏令时从冬季切换到夏季之前不到 128 纳秒,则会导致不存在的时间 (GH 31043)

  • 修复了 Period.to_timestamp()Period.start_time() 在微秒频率下返回的时间戳比正确时间早一纳秒的 Bug (GH 31475)

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

  • 修复了 DatetimeIndex 构造函数错误地接受 bool-dtype 输入的 Bug (GH 32668)

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

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

  • 修复了 Timestamp 算术运算中,当加减具有 timedelta64 dtype 的 np.ndarray 时发生的 Bug (GH 33296)

  • 修复了在不带参数调用时 DatetimeIndex.to_period() 未推断频率的 Bug (GH 33358)

  • 修复了 DatetimeIndex.tz_localize() 在某些情况下错误地保留了原始无效 freq 的 Bug (GH 30511)

  • 修复了 DatetimeIndex.intersection() 在某些情况下丢失 freq 和时区的 Bug (GH 33604)

  • 修复了 DatetimeIndex.get_indexer() 在处理混合日期时间类型目标时返回错误输出的 Bug (GH 33741)

  • 修复了 DatetimeIndex 与某些类型的 DateOffset 对象进行加减运算时,错误地保留了无效 freq 属性的 Bug (GH 33779)

  • 修复了 DatetimeIndex 中的一个 Bug,即在某个索引上设置 freq 属性可能会默默更改查看相同数据的另一个索引上的 freq 属性 (GH 33552)

  • DataFrame.min()DataFrame.max() 在对使用空的 pd.to_datetime() 初始化的对象调用时,返回的结果与 Series.min()Series.max() 不一致

  • 修复了 DatetimeIndex.intersection()TimedeltaIndex.intersection() 结果缺少正确 name 属性的 Bug (GH 33904)

  • 修复了 DatetimeArray.__setitem__()TimedeltaArray.__setitem__()PeriodArray.__setitem__() 错误地允许 int64 dtype 值静默转换的 Bug (GH 33717)

  • 修复了从 Period 减去 TimedeltaIndex 时,在某些应该成功的场景下错误地引发 TypeError,而在某些应该引发 TypeError 的场景下引发 IncompatibleFrequency 的 Bug (GH 33883)

  • 修复了从具有非纳秒分辨率的只读 NumPy 数组构造 SeriesIndex 时,当在时间戳范围内本应强制转换为 datetime64[ns] dtype 却转换为对象 dtype 的 Bug (GH 34843)。

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

  • 修复了 DataFrame.append() 中,当向空 DataFrame 附加包含标量时区感知 TimestampSeries 时,结果为对象列而不是 datetime64[ns, tz] dtype 的 Bug (GH 35038)

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

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

  • Tick 比较中存在的 bug,在与 timedelta-like 对象比较时会引发 TypeError (GH 34088)

  • Tick 乘法中存在的 bug,在乘以 float 时会引发 TypeError (GH 34486)

Timedelta#

时区#

  • to_datetime() 中存在的 bug,当 infer_datetime_format=True 时,时区名称(例如 UTC)无法正确解析 (GH 33133)

数值#

转换#

  • 从 big-endian datetime64 dtype 的 NumPy 数组构造 Series 时存在的 bug (GH 29684)

  • 构造 Timedelta 时存在的 bug,使用大的纳秒关键字值 (GH 32402)

  • 构造 DataFrame 时存在的 bug,set 会被重复而不是引发错误 (GH 32582)

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

  • 构造 DataFrame 时存在的 bug,使用列表初始化 frame 并使用嵌套列表为 MultiIndex 分配 columns (GH 32173)

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

字符串#

  • astype() 方法中存在的 bug,将“string” dtype 数据转换为可空整数 dtype 时 (GH 32450)。

  • 修复了对 StringArray 或具有 StringDtype 类型的 Seriesminmax 时会引发错误的问题。 (GH 31746)

  • Series.str.cat() 中存在的 bug,当 other 参数具有 Index 类型时返回 NaN 输出 (GH 33425)

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

区间#

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

索引#

缺失值#

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

  • Series.replace() 中存在的 bug,当参数 to_replace 为 dict/list 类型且用于包含 <NA>Series 时会引发 TypeError。现在该方法通过在进行替换比较时忽略 <NA> 值来处理此问题 (GH 32621)

  • any()all() 中存在的 bug,使用可空布尔 dtype 且 skipna=False 时,对于全为 False 或全为 True 的值会错误地返回 <NA> (GH 33253)

  • 澄清了 method=akima 的 interpolate 文档。der 参数必须是标量或 None (GH 33426)

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

  • 修复了在列名为字符串类型的 DataFrame 上调用 DataFrame.interpolate() 时会引发 ValueError 的错误。现在该方法不受列名类型的影响 (GH 33956)

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

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

MultiIndex#

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

  • 修复了使用 MultiIndex 调用 Dataframe.loc() 时出现的 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)

IO#

  • pandas.read_csv(), pandas.read_table()pandas.read_fwf()names 参数传递一个 set 会引发 ValueError: Names should be an ordered collection. (GH 34946)

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

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

  • read_csv() 现在在参数 headerprefix 都不是 None 时会引发 ValueError (GH 27394)

  • 修复了当 path_or_buf 是 S3 URI 时 DataFrame.to_json() 引发 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 在 Python 3 中读取 Python 2 中以固定格式写入的 DataFrame 时,导致 datetime64 列的 dtype 设置为 int64 的 Bug (GH 31750)

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

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

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

  • 修复了 read_excel() 处理带有高位代理(high surrogate)的 UTF-8 字符串时导致段错误(segmentation violation)的 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)

  • pandas.read_hdf() 在加载不受支持的 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() 在使用迭代器读取数据时导致分类变量具有不同 dtype 的 Bug (GH 31544)

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

  • 修复了 read_csv()read_table() 引发的 TypeError 异常在传递意外关键字参数时显示为 parser_f 的 Bug (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)

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

  • 修复了 DataFrame.to_sql() 在读取包含 -np.inf 条目且使用 MySQL 的 DataFrame 时,现在会给出更明确的 ValueError (GH 34431)

  • 修复了 read_* 函数无法解压缩大写文件扩展名的 Bug (GH 35164)

  • 修复了 read_excel()header=Noneindex_col 给定为 list 时引发 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)

绘图 (Plotting)#

GroupBy/resample/rolling#

重塑#

稀疏#

  • 从时区感知 dtype 创建 SparseArray 时,现在会在丢弃时区信息之前发出警告,而不是静默执行 (GH 32501)

  • arrays.SparseArray.from_spmatrix() 中存在一个 bug,错误地读取了 scipy 稀疏矩阵 (GH 31991)

  • Series.sum() 中存在一个 bug,当与 SparseArray 一起使用时会引发 TypeError (GH 25777)

  • DataFrame 中存在一个 bug,当包含填充了 NaN 的全稀疏 SparseArray 并通过列表状对象进行索引时 (GH 27781, GH 29563)

  • SparseDtype 的 repr 现在包含了其 fill_value 属性的 repr,而不是其字符串表示形式 (GH 34352)

  • DataFrame 中存在一个 bug,空的 DataFrame 无法转换为 SparseDtype (GH 33113)

  • arrays.SparseArray() 中存在一个 bug,当使用可迭代对象索引稀疏 dataframe 时,返回了不正确的类型 (GH 34526, GH 34540)

扩展数组#

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

  • 修复了 concat() 连接具有不重叠列的 DataFrame 对象时,结果为 object-dtype 而非保留扩展 dtype 的 bug (GH 27692, GH 33027)

  • 修复了当 pandas.options.mode.use_inf_as_na 设置为 True 时,StringArray.isna() 对于 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() 在对可为空的 Boolean dtypes 执行聚合时会忽略 min_count 参数的 bug (GH 34051)

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

  • DataFrame 中存在一个 bug,当列设置为标量扩展类型时,会被视为对象类型而不是扩展类型 (GH 34832)

  • 修复了 IntegerArray.astype() 中正确复制 mask 的 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 +