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
。
带键排序#
我们在 DataFrame
和 Series
的排序方法中添加了一个 key
参数,包括 DataFrame.sort_values()
、DataFrame.sort_index()
、Series.sort_values()
和 Series.sort_index()
。key
可以是任何可调用的函数,它在执行排序之前按列应用于用于排序的每一列 (GH 27237)。有关更多信息,请参阅 带键的 sort_values 和 带键的 sort_index。
In [25]: s = pd.Series(['C', 'a', 'B'])
In [26]: s
Out[26]:
0 C
1 a
2 B
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 参数#
Grouper
和 DataFrame.resample()
现在支持 origin
和 offset
参数。它允许用户控制调整分组的时间戳 (GH 31809)。
分组的 bin 是根据时间序列起始点的一天的开始时间进行调整的。这对于以一天为倍数(例如 30D
)或分割一天(例如 90s
或 1min
)的频率非常有效。但是,对于不符合此标准的某些频率,它可能会产生不一致性。为了改变这种行为,您现在可以使用 origin
参数指定一个固定的时间戳。
现在有两个参数被弃用(更多信息请参阅 DataFrame.resample()
的文档)
base
应由offset
替换。loffset
应由在重新采样后直接向DataFrame
的索引添加偏移量来替换。
origin
用法的小例子
In [38]: start, end = '2000-10-01 23:30:00', '2000-10-02 00:30:00'
In [39]: middle = '2000-10-02 00:00:00'
In [40]: rng = pd.date_range(start, end, freq='7min')
In [41]: ts = pd.Series(np.arange(len(rng)) * 3, index=rng)
In [42]: ts
Out[42]:
2000-10-01 23:30:00 0
2000-10-01 23:37:00 3
2000-10-01 23:44:00 6
2000-10-01 23:51:00 9
2000-10-01 23:58:00 12
2000-10-02 00:05:00 15
2000-10-02 00:12:00 18
2000-10-02 00:19:00 21
2000-10-02 00:26:00 24
Freq: 7min, 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
仍将引入与之前相同的包。
其他增强功能#
兼容 matplotlib 3.3.0 (GH 34850)
IntegerArray.astype()
现在支持datetime64
dtype (GH 32538)IntegerArray
现在实现了sum
操作 (GH 33172)添加了
pandas.api.indexers.FixedForwardWindowIndexer()
类,用于在rolling
操作期间支持前向窗口。添加了
pandas.api.indexers.VariableOffsetWindowIndexer()
类,用于支持具有非固定偏移量的rolling
操作 (GH 34994)。describe()
现在包含datetime_is_numeric
关键字,用于控制如何汇总 datetime 列 (GH 30164, GH 34798)。highlight_null()
现在接受subset
参数 (GH 31345)。当直接写入 sqlite 连接时,
DataFrame.to_sql()
现在支持multi
方法 (GH 29921)。pandas.errors.OptionError
现在在pandas.errors
中暴露 (GH 27553)。添加了
api.extensions.ExtensionArray.argmax()
和api.extensions.ExtensionArray.argmin()
(GH 24382)。当传入
start
、stop
和periods
时,timedelta_range()
现在将推断频率 (GH 32377)。对
IntervalIndex
进行位置切片现在支持步长step > 1
的切片 (GH 31658)。Series.str
现在有一个fullmatch
方法,该方法对Series
每行中的整个字符串进行正则表达式匹配,类似于re.fullmatch
(GH 32806)。DataFrame.sample()
现在也允许将 array-like 和 BitGenerator 对象作为种子传递给random_state
(GH 32503)。如果
MultiIndex
对象内部的对象不可排序,Index.union()
现在将引发RuntimeWarning
。传递sort=False
以 suppression 此警告 (GH 33015)。添加了
Series.dt.isocalendar()
和DatetimeIndex.isocalendar()
,它们返回一个DataFrame
,其中年份、周数和天数根据 ISO 8601 日历计算 (GH 33206, GH 34392)。DataFrame.to_feather()
方法现在支持 pyarrow 0.17 中添加的附加关键字参数(例如设置压缩)(GH 33422)。cut()
现在将接受参数ordered
,默认值为ordered=True
。如果ordered=False
且未提供标签,将引发错误 (GH 33141)。DataFrame.to_csv()
、DataFrame.to_pickle()
和DataFrame.to_json()
现在支持在使用gzip
和bz2
协议时传递压缩参数的字典。这可用于设置自定义压缩级别,例如df.to_csv(path, compression={'method': 'gzip', 'compresslevel': 1}
(GH 33196)。melt()
新增了一个ignore_index
(默认True
) 参数,如果设置为False
,则该方法不会丢弃索引 (GH 17440)。Series.update()
现在接受可以强制转换为Series
的对象,例如dict
和list
,与DataFrame.update()
的行为一致 (GH 33215)。DataFrameGroupBy.transform()
和DataFrameGroupBy.aggregate()
新增了engine
和engine_kwargs
参数,支持使用Numba
执行函数 (GH 32854, GH 33388)。Resampler.interpolate()
现在支持 SciPy 插值方法scipy.interpolate.CubicSpline
作为方法cubicspline
(GH 33670)。DataFrameGroupBy
和SeriesGroupBy
现在实现了sample
方法,用于在组内进行随机抽样 (GH 31775)。DataFrame.to_numpy()
现在支持na_value
关键字,用于控制输出数组中的 NA 标记值 (GH 33820)。将
api.extension.ExtensionArray.equals
添加到扩展数组接口中,类似于Series.equals()
(GH 27081)。在
read_stata()
和StataReader
中,支持的最低 dta 版本已提高到 105 (GH 26667)。to_stata()
支持使用compression
关键字参数进行压缩。压缩可以自动推断,也可以使用包含方法和传递给压缩库的任何额外参数的字符串或字典来显式设置。压缩功能也添加到了低级 Stata 文件写入器StataWriter
、StataWriter117
和StataWriterUTF8
(GH 26599)。HDFStore.put()
现在接受一个track_times
参数。此参数将传递给PyTables
的create_table
方法 (GH 32682)。Series.plot()
和DataFrame.plot()
现在接受xlabel
和ylabel
参数,用于在 x 轴和 y 轴上显示标签 (GH 9093)。使
Rolling
和Expanding
可迭代(GH 11704)。使
option_context
成为一个contextlib.ContextDecorator
,允许它作为装饰器应用于整个函数 (GH 34253)。DataFrame.to_csv()
和Series.to_csv()
现在接受一个errors
参数 (GH 22610)。DataFrameGroupBy.groupby.transform()
现在允许将func
设置为pad
、backfill
和cumcount
(GH 31269)。read_json()
现在接受一个nrows
参数。 (GH 33916)。DataFrame.hist()
、Series.hist()
、core.groupby.DataFrameGroupBy.hist()
和core.groupby.SeriesGroupBy.hist()
新增了legend
参数。设置为 True 可在直方图中显示图例。 (GH 6279)。concat()
和append()
现在保留扩展 dtype(数据类型),例如,将一个可为空的整型列与一个 numpy 整型列组合时,结果不再是 object dtype,而是保留整型 dtype (GH 33607, GH 34339, GH 34095)。read_gbq()
现在允许禁用进度条 (GH 33360)。read_gbq()
现在支持来自pandas-gbq
的max_results
kwarg 参数 (GH 34639)。DataFrame.cov()
和Series.cov()
现在支持一个新参数ddof
,用于支持 Delta 自由度(ddof),与相应的 numpy 方法一致 (GH 34611)。DataFrame.to_html()
和DataFrame.to_string()
的col_space
参数现在接受列表或字典,以仅更改某些特定列的宽度 (GH 28917)。DataFrame.to_excel()
现在也可以写入 OpenOffice 电子表格 (.ods) 文件 (GH 27222)。explode()
现在接受ignore_index
参数以重置索引,类似于pd.concat()
或DataFrame.sort_values()
(GH 34932)。DataFrame.to_markdown()
和Series.to_markdown()
现在接受index
参数作为 tabulate 的showindex
的别名 (GH 32667)。read_csv()
现在接受字符串值,例如 “0”、“0.0”、“1” 和 “1.0”,可转换为可为空的布尔 dtype (GH 34859)。ExponentialMovingWindow
现在支持一个times
参数,允许使用times
中的时间戳间隔计算mean
均值 (GH 34839)。DataFrame.agg()
和Series.agg()
现在接受命名聚合(named aggregation),用于重命名输出的列/索引。 (GH 26513)。compute.use_numba
现在作为一个配置选项存在,可在可用时利用 numba 引擎 (GH 33966, GH 35374)。Series.plot()
现在支持非对称误差条。以前,如果Series.plot()
收到一个带有yerr
和/或xerr
误差值的 “2xN” 数组,左/下值(第一行)会被镜像,而右/上值(第二行)会被忽略。现在,第一行代表左/下误差值,第二行代表右/上误差值。 (GH 9536)。
重要的 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_2
对 df
进行 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_2
对 df
进行 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
的类型引发 KeyError
或 TypeError
。现在它们始终引发 KeyError
(GH 31867)。
In [51]: ser1 = pd.Series(range(3), index=[0, 1, 2])
In [52]: ser2 = pd.Series(range(3), index=pd.date_range("2020-02-01", periods=3))
以前的行为:
In [3]: ser1[1.5]
...
TypeError: cannot do label indexing on Int64Index with these indexers [1.5] of type float
In [4] ser1["foo"]
...
KeyError: 'foo'
In [5]: ser1.loc[1.5]
...
TypeError: cannot do label indexing on Int64Index with these indexers [1.5] of type float
In [6]: ser1.loc["foo"]
...
KeyError: 'foo'
In [7]: ser2.loc[1]
...
TypeError: cannot do label indexing on DatetimeIndex with these indexers [1] of type int
In [8]: ser2.loc[pd.Timestamp(0)]
...
KeyError: Timestamp('1970-01-01 00:00:00')
新的行为:
In [3]: ser1[1.5]
...
KeyError: 1.5
In [4] ser1["foo"]
...
KeyError: 'foo'
In [5]: ser1.loc[1.5]
...
KeyError: 1.5
In [6]: ser1.loc["foo"]
...
KeyError: 'foo'
In [7]: ser2.loc[1]
...
KeyError: 1
In [8]: ser2.loc[pd.Timestamp(0)]
...
KeyError: Timestamp('1970-01-01 00:00:00')
类似地,DataFrame.at()
和 Series.at()
如果传递了不兼容的 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
以及函数 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
[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_equal
和 testing.assert_series_equal
#
check_freq
参数在 pandas 1.1.0 中添加到 testing.assert_frame_equal()
和 testing.assert_series_equal()
中,默认为 True
。 testing.assert_frame_equal()
和 testing.assert_series_equal()
现在如果索引没有相同的频率,则会引发 AssertionError
。在 pandas 1.1.0 之前,索引频率不会被检查。
依赖项的最低版本要求提高#
一些依赖项的最低支持版本已更新 (GH 33718, GH 29766, GH 29723, pytables >= 3.4.3)。如果安装了,我们现在要求最低版本为
包 |
最低版本 |
必需 |
已更改 |
---|---|---|---|
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 |
更多信息请参阅 Dependencies 和 Optional dependencies。
开发变更#
Cython 的最低版本现在是最新的 Bug 修复版本 (0.29.16) (GH 33334)。
弃用#
在
Series
上使用包含切片(例如ser[[slice(0, 4)]]
)的单元素列表进行查找已被弃用,并将在未来的版本中引发错误。请将列表转换为元组,或直接传递切片 (GH 31333)。DataFrame.mean()
和DataFrame.median()
使用numeric_only=None
时,在未来的版本中将包含datetime64
和datetime64tz
列 (GH 29941)。使用
.loc
和位置切片来设置值已被弃用,并将在未来的版本中引发错误。请改为使用带标签的.loc
或带位置的.iloc
(GH 31840)。DataFrame.to_dict()
已弃用接受orient
的短名称,并将在未来的版本中引发错误 (GH 32515)Categorical.to_dense()
已弃用,并将在未来的版本中移除,请改用np.asarray(cat)
(GH 32639)SingleBlockManager
构造函数中的fastpath
关键字已弃用,并将在未来的版本中移除 (GH 33092)在
pandas.merge()
中将suffixes
提供为set
已弃用。请改用元组 (GH 33740, GH 34741)。使用
[:, None]
等多维索引器对Series
进行索引以返回ndarray
现在会引发FutureWarning
。请改在索引之前将其转换为 NumPy 数组 (GH 27837)Index.is_mixed()
已弃用,并将在未来的版本中移除,请改直接检查index.inferred_type
(GH 32922)将除第一个参数以外的任何参数作为位置参数传递给
read_html()
已弃用。所有其他参数应作为关键字参数提供 (GH 27573)。将除
path_or_buf
(第一个) 以外的任何参数作为位置参数传递给read_json()
已弃用。所有其他参数应作为关键字参数提供 (GH 27573)。将除前两个参数以外的任何参数作为位置参数传递给
read_excel()
已弃用。所有其他参数应作为关键字参数提供 (GH 27573)。pandas.api.types.is_categorical()
已弃用,并将在未来的版本中移除;请改用pandas.api.types.is_categorical_dtype()
(GH 33385)Index.get_value()
已弃用,并将在未来的版本中移除 (GH 19728)Series.dt.week()
和Series.dt.weekofyear()
已弃用,并将在未来的版本中移除,请改用Series.dt.isocalendar().week()
(GH 33595)DatetimeIndex.week()
和DatetimeIndex.weekofyear
已弃用,并将在未来的版本中移除,请改用DatetimeIndex.isocalendar().week
(GH 33595)DatetimeArray.week()
和DatetimeArray.weekofyear
已弃用,并将在未来的版本中移除,请改用DatetimeArray.isocalendar().week
(GH 33595)DateOffset.__call__()
已弃用,并将在未来的版本中移除,请改用offset + other
(GH 34171)apply_index()
已弃用,并将在未来的版本中移除。请改用offset + other
(GH 34580)DataFrame.tshift()
和Series.tshift()
已弃用,并将在未来的版本中移除,请改用DataFrame.shift()
和Series.shift()
(GH 11631)使用浮点键对
Index
对象进行索引已弃用,并将在未来引发IndexError
。您可以改手动转换为整数键 (GH 34191)。Period.to_timestamp()
中的tz
关键字已弃用,并将在未来的版本中移除;请改用per.to_timestamp(...).tz_localize(tz)
(GH 34522)DatetimeIndex.to_perioddelta()
已弃用,并将在未来的版本中移除。请改用index - index.to_period(freq).to_timestamp()
(GH 34853)DataFrame.melt()
接受已存在的value_name
已弃用,并将在未来的版本中移除 (GH 34731)DataFrame.expanding()
函数中的center
关键字已弃用,并将在未来的版本中移除 (GH 20647)
性能改进#
内部索引方法
_shallow_copy()
现在将缓存的属性复制到新索引,避免在新索引上再次创建这些属性。这可以加快许多依赖于创建现有索引副本的操作 (GH 28584, GH 32640, GH 32669)使用
DataFrame.sparse.from_spmatrix()
构造函数从scipy.sparse
矩阵创建具有稀疏值的DataFrame
时性能显著提高 (GH 32821, GH 32825, GH 32826, GH 32856, GH 32858)。对分组方法
Groupby.first()
和Groupby.last()
的性能改进 (GH 34178)对于可空(整数和布尔)dtypes 的
factorize()
性能改进 (GH 33064)。构造
Categorical
对象时的性能改进 (GH 33921)修复了
pandas.qcut()
和pandas.cut()
中的性能回归问题 (GH 33921)对于可空(整数和布尔)dtypes 的约简(
sum
、prod
、min
、max
)性能改进 (GH 30982, GH 33261, GH 33442)。RollingGroupby
中的性能改进 (GH 34052)对于
MultiIndex
的算术运算(sub
、add
、mul
、div
)性能改进 (GH 34297)当
bool_indexer
是一个list
时,DataFrame[bool_indexer]
中的性能改进 (GH 33924)使用各种方式(如
io.formats.style.Styler.apply()
、io.formats.style.Styler.applymap()
或io.formats.style.Styler.bar()
)添加样式时,io.formats.style.Styler.render()
的性能显著提高 (GH 19917)
Bug 修复#
Categorical#
将无效的
fill_value
传递给Categorical.take()
会引发ValueError
而不是TypeError
(GH 33660)在诸如
concat()
或append()
等操作中,将包含整数类别的Categorical
(包含缺失值)与浮点 dtype 列组合时,现在将生成浮点列而不是对象 dtype 列 (GH 33607)修复了将分类数据与
dtype=object
一起传递给Index
构造函数时错误地返回CategoricalIndex
而非对象 dtypeIndex
的 Bug (GH 32167)修复了当任一元素缺失时,
Categorical
比较运算符__ne__
会错误地评估为False
的 Bug (GH 32276)Categorical.fillna()
现在接受Categorical
类型的other
参数 (GH 32420)Categorical
的表示形式未能区分int
和str
(GH 33676)
日期时间类型#
现在,将
int64
以外的整数 dtype 传递给np.array(period_index, dtype=...)
会引发TypeError
,而不是错误地使用int64
(GH 32255)如果轴不是
PeriodIndex
,Series.to_timestamp()
现在会引发TypeError
。之前会引发AttributeError
(GH 33327)如果轴不是
DatetimeIndex
,Series.to_period()
现在会引发TypeError
。之前会引发AttributeError
(GH 33327)修复了
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)修复了
DatetimeIndex
构造函数错误地接受bool
-dtype 输入的 Bug (GH 32668)修复了
DatetimeIndex.searchsorted()
不接受list
或Series
作为其参数的 Bug (GH 32762)修复了当传递字符串
Series
时PeriodIndex()
引发错误的 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 数组构造
Series
或Index
时,当在时间戳范围内本应强制转换为datetime64[ns]
dtype 却转换为对象 dtype 的 Bug (GH 34843)。Period
、date_range()
、period_range()
、pd.tseries.frequencies.to_offset()
中的freq
关键字不再允许使用元组,请改用字符串传递 (GH 34703)修复了
DataFrame.append()
中,当向空DataFrame
附加包含标量时区感知Timestamp
的Series
时,结果为对象列而不是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#
将
Timedelta
对象与timedelta64
dtype 的np.ndarray
比较时存在的 bug,会错误地将所有条目视为不相等 (GH 33441)timedelta_range()
中存在的 bug,会在边缘情况下产生额外一个点 (GH 30353, GH 33498)DataFrame.resample()
中存在的 bug,会在边缘情况下产生额外一个点 (GH 30353, GH 13022, GH 33498)DataFrame.resample()
中存在的 bug,在处理 timedelta 时会忽略loffset
参数 (GH 7687, GH 33498)Timedelta
和pandas.to_timedelta()
中存在的 bug,对于字符串输入会忽略unit
参数 (GH 12136)
时区#
to_datetime()
中存在的 bug,当infer_datetime_format=True
时,时区名称(例如UTC
)无法正确解析 (GH 33133)
数值#
DataFrame.floordiv()
中存在的 bug,当axis=0
时,对除以零的处理方式与Series.floordiv()
不同 (GH 31271)to_numeric()
中存在的 bug,当字符串参数为"uint64"
且errors="coerce"
时会静默失败 (GH 32394)to_numeric()
中存在的 bug,当downcast="unsigned"
时,对空数据会失败 (GH 32493)DataFrame.mean()
中存在的 bug,当numeric_only=False
且列为datetime64
dtype 或PeriodDtype
时会错误地引发TypeError
(GH 32426)DataFrame.count()
中存在的 bug,当level="foo"
且索引级别"foo"
包含 NaNs 时会导致 segmentation fault (GH 21824)DataFrame.diff()
中存在的 bug,当axis=1
时,对于混合 dtypes 会返回不正确的结果 (GH 32995)DataFrame.corr()
和DataFrame.cov()
中存在的 bug,在处理包含pandas.NA
的可空整数列时会引发错误 (GH 33803)DataFrame
和Series
中存在的 bug,对 object-dtype 对象与datetime64
dtype 对象进行加减法运算 (GH 33824)Index.difference()
中存在的 bug,比较Float64Index
和 objectIndex
时会给出不正确的结果 (GH 35217)DataFrame
reduction(例如df.min()
、df.max()
)中存在的 bug,涉及ExtensionArray
dtypes (GH 34520, GH 32651)Series.interpolate()
和DataFrame.interpolate()
现在会在limit_direction
为'forward'
或'both'
且method
为'backfill'
或'bfill'
时引发 ValueError,或者在limit_direction
为'backward'
或'both'
且method
为'pad'
或'ffill'
时引发 ValueError (GH 34746)
转换#
从 big-endian
datetime64
dtype 的 NumPy 数组构造Series
时存在的 bug (GH 29684)DataFrame
构造函数不再接受DataFrame
对象的列表。由于 NumPy 的变化,DataFrame
对象现在始终被视为二维对象,因此DataFrame
对象的列表被视为三维,不再被DataFrame
构造函数接受 (GH 32289)。构造
DataFrame
时存在的 bug,使用列表初始化 frame 并使用嵌套列表为MultiIndex
分配columns
(GH 32173)改进了创建新索引时使用无效列表构造的错误消息 (GH 35190)
字符串#
区间#
IntervalArray
中存在的 bug,在设置值时错误地允许更改底层数据 (GH 32782)
索引#
DataFrame.xs()
现在会在提供level
关键字且 axis 不是MultiIndex
时引发TypeError
。之前会引发AttributeError
(GH 33610)对带有部分时间戳的
DatetimeIndex
进行切片时存在的 bug,会丢失年末、季末或月末附近的高精度索引 (GH 31064)PeriodIndex.get_loc()
中存在的 bug,将更高精度的字符串处理方式与PeriodIndex.get_value()
不同 (GH 31172)Series.at()
和DataFrame.at()
中存在的 bug,在Float64Index
中查找整数时不匹配.loc
的行为 (GH 31329)PeriodIndex.is_monotonic()
中存在的 bug,当包含开头的NaT
条目时会错误地返回True
(GH 31437)DatetimeIndex.get_loc()
中存在的 bug,引发KeyError
时使用了转换后的整数 key 而不是用户传入的 key (GH 31425)Series.xs()
中存在的 bug,在某些 object-dtype 情况下会错误地返回Timestamp
而不是datetime64
(GH 31630)DataFrame.iat()
中存在的 bug,在某些 object-dtype 情况下会错误地返回Timestamp
而不是datetime
(GH 32809)DataFrame.at()
中存在的 bug,当 columns 或 index 非唯一时 (GH 33041)Series.loc()
和DataFrame.loc()
中存在的 bug,当使用整数 key 索引非全整数的 object-dtypeIndex
时 (GH 31905)对具有重复列的
DataFrame
使用DataFrame.iloc.__setitem__()
时存在的 bug,会错误地为所有匹配列设置值 (GH 15686, GH 22036)对
DatetimeIndex
、TimedeltaIndex
或PeriodIndex
使用DataFrame.loc()
和Series.loc()
时存在的 bug,会错误地允许查找不匹配的 datetime-like dtypes (GH 32650)Series.__getitem__()
中存在的 bug,使用非标准标量(例如np.dtype
)进行索引 (GH 32684)DataFrame.lookup()
中存在的 bug,当frame.index
或frame.columns
非唯一时会错误地引发AttributeError
;现在会引发带有有用错误消息的ValueError
(GH 33041)DataFrame.copy()
中存在的 bug,复制后未使 _item_cache 失效,导致复制后的值更新未被反映 (GH 31784)修复了
DataFrame.loc()
和Series.loc()
中的回归问题,提供datetime64[ns, tz]
值时会抛出错误 (GH 32395)Series.__getitem__()
中存在的 bug,使用整数 key 和具有 leading integer level 的MultiIndex
时,如果 key 不存在于第一级,则未能引发KeyError
(GH 33355)DataFrame.iloc()
中存在的 bug,切片具有ExtensionDtype
的单列DataFrame
(例如df.iloc[:, :1]
)时返回无效结果 (GH 32957)DatetimeIndex.insert()
和TimedeltaIndex.insert()
中存在的 bug,将元素设置到空Series
中时导致索引的freq
丢失 (GH 33573)使用
IntervalIndex
和整数的 list-like key 调用Series.__setitem__()
时存在的 bug (GH 33473)Series.__getitem__()
中存在的 bug,允许使用np.ndarray
、Index
、Series
indexers 查找缺失标签,但不允许使用list
;现在所有这些情况都会引发KeyError
(GH 33646)DataFrame.truncate()
和Series.truncate()
中存在的 bug,其中假设索引是单调递增的 (GH 33756)使用表示 datetime 的字符串列表对
DatetimeIndex
或PeriodIndex
进行索引失败 (GH 11278)使用
MultiIndex
调用Series.at()
时存在的 bug,对有效输入会引发异常 (GH 26989)使用值字典调用
DataFrame.loc()
时存在的 bug,会将 dtype 为int
的列更改为float
(GH 34573)使用
MultiIndex
调用Series.loc()
时存在的 bug,访问None
值时会引发IndexingError
(GH 34318)DataFrame.reset_index()
和Series.reset_index()
中存在的 bug,不会保留具有MultiIndex
的空DataFrame
或Series
的数据类型 (GH 19602)对包含
NaT
条目的DatetimeIndex
使用time
key 进行Series
和DataFrame
索引时存在的 bug (GH 35114)
缺失值#
在空
Series
上调用fillna()
现在会正确返回一个浅拷贝对象。该行为现在与Index
、DataFrame
和非空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
,bfill
和backfill
方法进行插值与使用DataFrame.fillna()
方法的结果相同 (GH 12918, GH 29146)修复了在列名为字符串类型的
DataFrame
上调用DataFrame.interpolate()
时会引发 ValueError 的错误。现在该方法不受列名类型的影响 (GH 33956)现在,在格式字符串中使用格式规范传递
NA
将会生效。例如,"{:.1f}".format(pd.NA)
之前会引发ValueError
,现在将返回字符串"<NA>"
(GH 34740)修复了
Series.map()
在遇到无效的na_action
时未引发错误的 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]
修复了
MultiIndex.intersection()
在sort=False
时无法保证顺序的 Bug (GH 31325)修复了
DataFrame.truncate()
会丢失MultiIndex
名称的 Bug (GH 34564)
In [81]: left = pd.MultiIndex.from_arrays([["b", "a"], [2, 1]])
In [82]: right = pd.MultiIndex.from_arrays([["a", "b", "c"], [1, 2, 3]])
# Common elements are now guaranteed to be ordered by the left side
In [83]: left.intersection(right, sort=False)
Out[83]:
MultiIndex([('b', 2),
('a', 1)],
)
修复了在未指定级别且列不同的情况下连接两个
MultiIndex
时出现的 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()
现在在参数header
和prefix
都不是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=None
与comment
关键字组合使用时引发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()
现在可以在设置lines
和chunksize
时,从文件 url 读取行分隔的 json 文件。修复了
DataFrame.to_sql()
在读取包含-np.inf
条目且使用 MySQL 的 DataFrame 时,现在会给出更明确的ValueError
(GH 34431)修复了
read_*
函数无法解压缩大写文件扩展名的 Bug (GH 35164)修复了
read_excel()
在header=None
且index_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)#
DataFrame.plot()
对于线/柱状图现在支持通过字典指定颜色 (GH 8193)。修复了
DataFrame.plot.hist()
在多列情况下权重不起作用的 Bug (GH 33173)修复了
DataFrame.boxplot()
和DataFrame.plot.boxplot()
丢失medianprops
,whiskerprops
,capprops
和boxprops
的颜色属性的 Bug (GH 30346)修复了
DataFrame.hist()
忽略column
参数顺序的 Bug (GH 29235)修复了
DataFrame.plot.scatter()
在添加多个使用不同cmap
的图时,色条总是使用第一个cmap
的 Bug (GH 33389)修复了
DataFrame.plot.scatter()
即使参数c
被指定为包含颜色名称的列,也会向图中添加色条的 Bug (GH 34316)修复了
pandas.plotting.bootstrap_plot()
导致轴混乱和标签重叠的 Bug (GH 34905)修复了
DataFrame.plot.scatter()
在绘制可变标记大小时导致错误的 Bug (GH 32904)
GroupBy/resample/rolling#
现在使用
pandas.api.indexers.BaseIndexer
和count
,min
,max
,median
,skew
,cov
,corr
会对任何单调的pandas.api.indexers.BaseIndexer
后代返回正确的结果 (GH 32865)DataFrameGroupby.mean()
和SeriesGroupby.mean()
(以及类似的median()
,std()
和var()
) 现在在传入不可接受的关键字参数时会引发TypeError
。之前会引发UnsupportedFunctionCall
(如果将min_count
传入median()
则引发AssertionError
) (GH 31485)修复了
DataFrameGroupBy.apply()
和SeriesGroupBy.apply()
在by
轴未排序、有重复项且应用的func
不改变传入对象时引发ValueError
的 Bug (GH 30667)修复了
DataFrameGroupBy.transform()
使用转换函数生成不正确结果的 Bug (GH 30918)修复了
DataFrameGroupBy.transform()
和SeriesGroupBy.transform()
在按多个键进行分组时(其中一些是分类的,另一些不是)返回错误结果的 Bug (GH 32494)修复了
DataFrameGroupBy.count()
和SeriesGroupBy.count()
在分组列包含 NaN 时导致段错误的 Bug (GH 32841)修复了
DataFrame.groupby()
和Series.groupby()
在聚合布尔Series
时生成不一致类型的 Bug (GH 32894)修复了
DataFrameGroupBy.sum()
和SeriesGroupBy.sum()
在可空整数 dtype 的非空值数量低于min_count
时返回一个大的负数的 Bug (GH 32861)修复了
SeriesGroupBy.quantile()
在可空整数上引发错误的 Bug (GH 33136)在
DataFrame.resample()
中存在一个 bug,当结果为时区感知DatetimeIndex
并且在午夜发生夏令时转换时,会引发AmbiguousTimeError
(GH 25758)在
DataFrame.groupby()
中存在一个 bug,当按具有只读类别和sort=False
的分类列进行分组时,会引发ValueError
(GH 33410)在
DataFrameGroupBy.agg()
、SeriesGroupBy.agg()
、DataFrameGroupBy.transform()
、SeriesGroupBy.transform()
、DataFrameGroupBy.resample()
和SeriesGroupBy.resample()
中存在一个 bug,其中子类未被保留 (GH 28330)在
SeriesGroupBy.agg()
中存在一个 bug,以前在SeriesGroupBy
的命名聚合中接受任何列名。现在仅允许使用str
和可调用对象,否则会引发TypeError
。(GH 34422)在
DataFrame.groupby()
中存在一个 bug,当某个agg
键引用空列表时,会丢失Index
的名称 (GH 32580)在
Rolling.apply()
中存在一个 bug,当指定engine='numba'
时,center=True
被忽略 (GH 34784)在
DataFrame.ewm.cov()
中存在一个 bug,对于MultiIndex
输入会引发AssertionError
(GH 34440)在
core.groupby.DataFrameGroupBy.quantile()
中存在一个 bug,对于非数值类型会引发TypeError
,而不是丢弃这些列 (GH 27892)在
core.groupby.DataFrameGroupBy.transform()
中存在一个 bug,当func='nunique'
并且列类型为datetime64
时,结果类型会是datetime64
而不是int64
(GH 35109)在
DataFrame.groupby()
中存在一个 bug,当选择列并使用as_index=False
进行聚合时,会引发AttributeError
(GH 35246)。在
DataFrameGroupBy.first()
和DataFrameGroupBy.last()
中存在一个 bug,当按多个Categoricals
进行分组时,会引发不必要的ValueError
(GH 34951)
重塑#
影响所有数值和布尔值缩减方法未能返回子类数据类型的 bug。(GH 25596)
在
DataFrame.pivot_table()
中存在一个 bug,当只设置了MultiIndexed
列时 (GH 17038)在
DataFrame.unstack()
和Series.unstack()
中存在一个 bug,可以在MultiIndexed
数据中接受元组名称 (GH 19966)在
DataFrame.pivot_table()
中存在一个 bug,当margin
为True
并且只定义了column
时 (GH 31016)修复了
DataFrame.pivot()
在columns
设置为None
时显示不正确错误消息的 bug。(GH 30924)在
crosstab()
中存在一个 bug,当输入是两个具有元组名称的Series
时,输出会将一个虚拟的MultiIndex
作为列保留。(GH 18321)DataFrame.pivot()
现在可以接受列表作为index
和columns
参数 (GH 21425)在
SeriesGroupBy.aggregate()
中存在一个 bug,导致聚合名称相同时聚合被覆盖 (GH 30880)在
Index.astype()
中存在一个 bug,当从Float64Index
转换为Int64Index
或转换为ExtensionArray
dtype 时,会丢失name
属性 (GH 32013)Series.append()
现在在传递DataFrame
或包含DataFrame
的序列时会引发TypeError
(GH 31413)如果
to_replace
不是预期的类型,DataFrame.replace()
和Series.replace()
将引发TypeError
。以前则会静默失败 (GH 18634)在
Series
的就地操作中存在一个 bug,该操作会将原来使用inplace=True
丢弃的列重新添加到DataFrame
中 (GH 30484)在
DataFrame.apply()
中存在一个 bug,即使请求了raw=True
,回调函数仍会使用Series
参数调用。(GH 32423)在
DataFrame.pivot_table()
中存在一个 bug,当从时区感知 dtype 的列创建MultiIndex
级别时,会丢失时区信息 (GH 32558)在
concat()
中存在一个 bug,当将非字典映射作为objs
传递时会引发TypeError
(GH 32863)DataFrame.agg()
现在在尝试聚合不存在的列时提供了更具描述性的SpecificationError
消息 (GH 32755)在
DataFrame.unstack()
中存在一个 bug,当使用MultiIndex
列和MultiIndex
行时 (GH 32624, GH 24729 和 GH 28306)在未传递
ignore_index=True
的情况下将字典附加到DataFrame
会引发TypeError: Can only append a dict if ignore_index=True
,而不是TypeError: Can only append a :class:`Series` if ignore_index=True or if the :class:`Series` has a name
(GH 30871)在
DataFrame.corrwith()
、DataFrame.memory_usage()
、DataFrame.dot()
、DataFrame.idxmin()
、DataFrame.idxmax()
、DataFrame.duplicated()
、DataFrame.isin()
、DataFrame.count()
、Series.explode()
、Series.asof()
和DataFrame.asof()
中存在一个 bug,未能返回子类类型。(GH 31331)在
concat()
中存在一个 bug,不允许连接具有重复键的DataFrame
和Series
(GH 33654)在
Dataframe.aggregate()
和Series.aggregate()
中存在一个 bug,在某些情况下会导致递归循环 (GH 34224)修复了
melt()
中的一个 bug,当熔化MultiIndex
列且col_level > 0
时,会在id_vars
上引发KeyError
(GH 34129)在
Series.where()
中存在一个 bug,当空Series
和空的非 bool 类型cond
一起使用时 (GH 34592)修复了
DataFrame.apply()
对于具有S
dtype 元素的回归 bug,该 bug 会引发ValueError
(GH 34529)
稀疏#
从时区感知 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)修复了导致
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)。
其他#
修复了
pandas.testing.assert_series_equal()
在check_series_type=True
且left
参数是不同子类时未能正确引发异常的问题 (GH 32670)。在
DataFrame.query()
或DataFrame.eval()
字符串中获取缺失属性时,现在会引发正确的AttributeError
(GH 32408)修复了
pandas.testing.assert_series_equal()
在check_dtype
为False
时,仍然检查Interval
和ExtensionArray
操作数的数据类型的错误 (GH 32747)DataFrame.__dir__()
中的一个错误在使用 unicode 代理项作为列名时导致段错误 (segfault) (GH 25509)DataFrame.equals()
和Series.equals()
中允许子类相等的一个错误 (GH 34402)。
贡献者#
共有 368 人为此版本贡献了补丁。名字旁带有“+”号的人是首次贡献补丁。
3vts +
A Brooks +
Abbie Popa +
Achmad Syarif Hidayatullah +
Adam W Bagaskarta +
Adrian Mastronardi +
Aidan Montare +
Akbar Septriyan +
Akos Furton +
Alejandro Hall +
Alex Hall +
Alex Itkes +
Alex Kirko
Ali McMaster +
Alvaro Aleman +
Amy Graham +
Andrew Schonfeld +
Andrew Shumanskiy +
Andrew Wieteska +
Angela Ambroz
Anjali Singh +
Anna Daglis
Anthony Milbourne +
Antony Lee +
Ari Sosnovsky +
Arkadeep Adhikari +
Arunim Samudra +
Ashkan +
Ashwin Prakash Nalwade +
Ashwin Srinath +
Atsushi Nukariya +
Ayappan +
Ayla Khan +
Bart +
Bart Broere +
Benjamin Beier Liu +
Benjamin Fischer +
Bharat Raghunathan
Bradley Dice +
Brendan Sullivan +
Brian Strand +
Carsten van Weelden +
Chamoun Saoma +
ChrisRobo +
Christian Chwala
Christopher Whelan
Christos Petropoulos +
Chuanzhu Xu
CloseChoice +
Clément Robert +
CuylenE +
DanBasson +
Daniel Saxton
Danilo Horta +
DavaIlhamHaeruzaman +
Dave Hirschfeld
Dave Hughes
David Rouquet +
David S +
Deepyaman Datta
Dennis Bakhuis +
Derek McCammond +
Devjeet Roy +
Diane Trout
Dina +
Dom +
Drew Seibert +
EdAbati
Emiliano Jordan +
Erfan Nariman +
Eric Groszman +
Erik Hasse +
Erkam Uyanik +
Evan D +
Evan Kanter +
Fangchen Li +
Farhan Reynaldo +
Farhan Reynaldo Hutabarat +
Florian Jetter +
Fred Reiss +
GYHHAHA +
Gabriel Moreira +
Gabriel Tutui +
Galuh Sahid
Gaurav Chauhan +
George Hartzell +
Gim Seng +
Giovanni Lanzani +
Gordon Chen +
Graham Wetzler +
Guillaume Lemaitre
Guillem Sánchez +
HH-MWB +
Harshavardhan Bachina
How Si Wei
Ian Eaves
Iqrar Agalosi Nureyza +
Irv Lustig
Iva Laginja +
JDkuba
Jack Greisman +
Jacob Austin +
Jacob Deppen +
Jacob Peacock +
Jake Tae +
Jake Vanderplas +
James Cobon-Kerr
Jan Červenka +
Jan Škoda
Jane Chen +
Jean-Francois Zinque +
Jeanderson Barros Candido +
Jeff Reback
Jered Dominguez-Trujillo +
Jeremy Schendel
Jesse Farnham
Jiaxiang
Jihwan Song +
Joaquim L. Viegas +
Joel Nothman
John Bodley +
John Paton +
Jon Thielen +
Joris Van den Bossche
Jose Manuel Martí +
Joseph Gulian +
Josh Dimarsky
Joy Bhalla +
João Veiga +
Julian de Ruiter +
Justin Essert +
Justin Zheng
KD-dev-lab +
Kaiqi Dong
Karthik Mathur +
Kaushal Rohit +
Kee Chong Tan
Ken Mankoff +
Kendall Masse
Kenny Huynh +
Ketan +
Kevin Anderson +
Kevin Bowey +
Kevin Sheppard
Kilian Lieret +
Koki Nishihara +
Krishna Chivukula +
KrishnaSai2020 +
Lesley +
Lewis Cowles +
Linda Chen +
Linxiao Wu +
Lucca Delchiaro Costabile +
MBrouns +
Mabel Villalba
Mabroor Ahmed +
Madhuri Palanivelu +
Mak Sze Chun
Malcolm +
Marc Garcia
Marco Gorelli
Marian Denes +
Martin Bjeldbak Madsen +
Martin Durant +
Martin Fleischmann +
Martin Jones +
Martin Winkel
Martina Oefelein +
Marvzinc +
María Marino +
Matheus Cardoso +
Mathis Felardos +
Matt Roeschke
Matteo Felici +
Matteo Santamaria +
Matthew Roeschke
Matthias Bussonnier
Max Chen
Max Halford +
Mayank Bisht +
Megan Thong +
Michael Marino +
Miguel Marques +
Mike Kutzma
Mohammad Hasnain Mohsin Rajan +
Mohammad Jafar Mashhadi +
MomIsBestFriend
Monica +
Natalie Jann
Nate Armstrong +
Nathanael +
Nick Newman +
Nico Schlömer +
Niklas Weber +
ObliviousParadigm +
Olga Lyashevska +
OlivierLuG +
Pandas Development Team
Parallels +
Patrick +
Patrick Cando +
Paul Lilley +
Paul Sanders +
Pearcekieser +
Pedro Larroy +
Pedro Reys
Peter Bull +
Peter Steinbach +
Phan Duc Nhat Minh +
Phil Kirlin +
Pierre-Yves Bourguignon +
Piotr Kasprzyk +
Piotr Niełacny +
Prakhar Pandey
Prashant Anand +
Puneetha Pai +
Quang Nguyễn +
Rafael Jaimes III +
Rafif +
RaisaDZ +
Rakshit Naidu +
Ram Rachum +
Red +
Ricardo Alanis +
Richard Shadrach +
Rik-de-Kort
Robert de Vries
Robin to Roxel +
Roger Erens +
Rohith295 +
Roman Yurchak
Ror +
Rushabh Vasani
Ryan
Ryan Nazareth
SAI SRAVAN MEDICHERLA +
SHUBH CHATTERJEE +
Sam Cohan
Samira-g-js +
Sandu Ursu +
Sang Agung +
SanthoshBala18 +
Sasidhar Kasturi +
SatheeshKumar Mohan +
Saul Shanabrook
Scott Gigante +
Sebastian Berg +
Sebastián Vanrell
Sergei Chipiga +
Sergey +
ShilpaSugan +
Simon Gibbons
Simon Hawkins
Simon Legner +
Soham Tiwari +
Song Wenhao +
Souvik Mandal
Spencer Clark
Steffen Rehberg +
Steffen Schmitz +
Stijn Van Hoey
Stéphan Taljaard
SultanOrazbayev +
Sumanau Sareen
SurajH1 +
Suvayu Ali +
Terji Petersen
Thomas J Fan +
Thomas Li
Thomas Smith +
Tim Swast
Tobias Pitters +
Tom +
Tom Augspurger
Uwe L. Korn
Valentin Iovene +
Vandana Iyer +
Venkatesh Datta +
Vijay Sai Mutyala +
Vikas Pandey
Vipul Rai +
Vishwam Pandya +
Vladimir Berkutov +
Will Ayd
Will Holmgren
William +
William Ayd
Yago González +
Yosuke KOBAYASHI +
Zachary Lawrence +
Zaky Bilfagih +
Zeb Nicholls +
alimcmaster1
alm +
andhikayusup +
andresmcneill +
avinashpancham +
benabel +
bernie gray +
biddwan09 +
brock +
chris-b1
cleconte987 +
dan1261 +
david-cortes +
davidwales +
dequadras +
dhuettenmoser +
dilex42 +
elmonsomiat +
epizzigoni +
fjetter
gabrielvf1 +
gdex1 +
gfyoung
guru kiran +
h-vishal
iamshwin
jamin-aws-ospo +
jbrockmendel
jfcorbett +
jnecus +
kernc
kota matsuoka +
kylekeppler +
leandermaben +
link2xt +
manoj_koneni +
marydmit +
masterpiga +
maxime.song +
mglasder +
moaraccounts +
mproszewska
neilkg
nrebena
ossdev07 +
paihu
pan Jacek +
partev +
patrick +
pedrooa +
pizzathief +
proost
pvanhauw +
rbenes
rebecca-palmer
rhshadrach +
rjfs +
s-scherrer +
sage +
sagungrp +
salem3358 +
saloni30 +
smartswdeveloper +
smartvinnetou +
themien +
timhunderwood +
tolhassianipar +
tonywu1999
tsvikas
tv3141
venkateshdatta1993 +
vivikelapoutre +
willbowditch +
willpeppo +
za +
zaki-indra +