What’s new in 1.2.0 (December 26, 2020) — pandas 3.0.0rc0+33.g1fd184de2a documentation (original) (raw)
These are the changes in pandas 1.2.0. See Release notes for a full changelog including other versions of pandas.
Warning
The xlwt package for writing old-style .xlsexcel files is no longer maintained. The xlrd package is now only for reading old-style .xls files.
Previously, the default argument engine=None to read_excel()would result in using the xlrd engine in many cases, including new Excel 2007+ (.xlsx) files. If openpyxl is installed, many of these cases will now default to using the openpyxl engine. See the read_excel() documentation for more details.
Thus, it is strongly encouraged to install openpyxl to read Excel 2007+ (.xlsx) files.**Please do not report issues when using ``xlrd`` to read ``.xlsx`` files.**This is no longer supported, switch to using openpyxl instead.
Attempting to use the xlwt engine will raise a FutureWarningunless the option io.excel.xls.writer is set to "xlwt". While this option is now deprecated and will also raise a FutureWarning, it can be globally set and the warning suppressed. Users are recommended to write .xlsx files using the openpyxl engine instead.
Enhancements#
Optionally disallow duplicate labels#
Series and DataFrame can now be created with allows_duplicate_labels=False flag to control whether the index or columns can contain duplicate labels (GH 28394). This can be used to prevent accidental introduction of duplicate labels, which can affect downstream operations.
By default, duplicates continue to be allowed.
In [1]: pd.Series([1, 2], index=['a', 'a']) Out[1]: a 1 a 2 Length: 2, dtype: int64
In [2]: pd.Series([1, 2], index=['a', 'a']).set_flags(allows_duplicate_labels=False) ... DuplicateLabelError: Index has duplicates. positions label a [0, 1]
pandas will propagate the allows_duplicate_labels property through many operations.
In [3]: a = ( ...: pd.Series([1, 2], index=['a', 'b']) ...: .set_flags(allows_duplicate_labels=False) ...: )
In [4]: a Out[4]: a 1 b 2 Length: 2, dtype: int64
An operation introducing duplicates
In [5]: a.reindex(['a', 'b', 'a']) ... DuplicateLabelError: Index has duplicates. positions label a [0, 2]
[1 rows x 1 columns]
Warning
This is an experimental feature. Currently, many methods fail to propagate the allows_duplicate_labels value. In future versions it is expected that every method taking or returning one or more DataFrame or Series objects will propagate allows_duplicate_labels.
See Duplicate Labels for more.
The allows_duplicate_labels flag is stored in the new DataFrame.flagsattribute. This stores global attributes that apply to the pandas object. This differs from DataFrame.attrs, which stores information that applies to the dataset.
Passing arguments to fsspec backends#
Many read/write functions have acquired the storage_options optional argument, to pass a dictionary of parameters to the storage backend. This allows, for example, for passing credentials to S3 and GCS storage. The details of what parameters can be passed to which backends can be found in the documentation of the individual storage backends (detailed from the fsspec docs forbuiltin implementations and linked to external ones). See Section Reading/writing remote files.
GH 35655 added fsspec support (including storage_options) for reading excel files.
Support for binary file handles in to_csv#
to_csv() supports file handles in binary mode (GH 19827 and GH 35058) with encoding (GH 13068 and GH 23854) and compression (GH 22555). If pandas does not automatically detect whether the file handle is opened in binary or text mode, it is necessary to provide mode="wb".
For example:
In [1]: import io
In [2]: data = pd.DataFrame([0, 1, 2])
In [3]: buffer = io.BytesIO()
In [4]: data.to_csv(buffer, encoding="utf-8", compression="gzip")
Support for short caption and table position in to_latex#
DataFrame.to_latex() now allows one to specify a floating table position (GH 35281) and a short caption (GH 36267).
The keyword position has been added to set the position.
In [5]: data = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
In [6]: table = data.to_latex(position='ht')
In [7]: print(table) \begin{table}[ht] \begin{tabular}{lrr} \toprule & a & b \ \midrule 0 & 1 & 3 \ 1 & 2 & 4 \ \bottomrule \end{tabular} \end{table}
Usage of the keyword caption has been extended. Besides taking a single string as an argument, one can optionally provide a tuple (full_caption, short_caption)to add a short caption macro.
In [8]: data = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
In [9]: table = data.to_latex(caption=('the full long caption', 'short caption'))
In [10]: print(table) \begin{table} \caption[short caption]{the full long caption} \begin{tabular}{lrr} \toprule & a & b \ \midrule 0 & 1 & 3 \ 1 & 2 & 4 \ \bottomrule \end{tabular} \end{table}
Change in default floating precision for read_csv and read_table#
For the C parsing engine, the methods read_csv() and read_table() previously defaulted to a parser that could read floating point numbers slightly incorrectly with respect to the last bit in precision. The option floating_precision="high" has always been available to avoid this issue. Beginning with this version, the default is now to use the more accurate parser by makingfloating_precision=None correspond to the high precision parser, and the new optionfloating_precision="legacy" to use the legacy parser. The change to using the higher precision parser by default should have no impact on performance. (GH 17154)
Experimental nullable data types for float data#
We’ve added Float32Dtype / Float64Dtype and FloatingArray. These are extension data types dedicated to floating point data that can hold thepd.NA missing value indicator (GH 32265, GH 34307).
While the default float data type already supports missing values using np.nan, these new data types use pd.NA (and its corresponding behavior) as the missing value indicator, in line with the already existing nullable integerand boolean data types.
One example where the behavior of np.nan and pd.NA is different is comparison operations:
the default NumPy float64 dtype
In [11]: s1 = pd.Series([1.5, None])
In [12]: s1 Out[12]: 0 1.5 1 NaN dtype: float64
In [13]: s1 > 1 Out[13]: 0 True 1 False dtype: bool
the new nullable float64 dtype
In [14]: s2 = pd.Series([1.5, None], dtype="Float64")
In [15]: s2 Out[15]: 0 1.5 1 dtype: Float64
In [16]: s2 > 1 Out[16]: 0 True 1 dtype: boolean
See the NA semantics doc section for more details on the behavior when using the pd.NA missing value indicator.
As shown above, the dtype can be specified using the “Float64” or “Float32” string (capitalized to distinguish it from the default “float64” data type). Alternatively, you can also use the dtype object:
In [17]: pd.Series([1.5, None], dtype=pd.Float32Dtype()) Out[17]: 0 1.5 1 dtype: Float32
Operations with the existing integer or boolean nullable data types that give float results will now also use the nullable floating data types (GH 38178).
Warning
Experimental: the new floating data types are currently experimental, and their behavior or API may still change without warning. Especially the behavior regarding NaN (distinct from NA missing values) is subject to change.
Index/column name preservation when aggregating#
When aggregating using concat() or the DataFrame constructor, pandas will now attempt to preserve index and column names whenever possible (GH 35847). In the case where all inputs share a common name, this name will be assigned to the result. When the input names do not all agree, the result will be unnamed. Here is an example where the index name is preserved:
In [18]: idx = pd.Index(range(5), name='abc')
In [19]: ser = pd.Series(range(5, 10), index=idx)
In [20]: pd.concat({'x': ser[1:], 'y': ser[:-1]}, axis=1)
Out[20]:
x y
abc
1 6.0 6.0
2 7.0 7.0
3 8.0 8.0
4 9.0 NaN
0 NaN 5.0
The same is true for MultiIndex, but the logic is applied separately on a level-by-level basis.
GroupBy supports EWM operations directly#
DataFrameGroupBy now supports exponentially weighted window operations directly (GH 16037).
In [21]: df = pd.DataFrame({'A': ['a', 'b', 'a', 'b'], 'B': range(4)})
In [22]: df Out[22]: A B 0 a 0 1 b 1 2 a 2 3 b 3
In [23]: df.groupby('A').ewm(com=1.0).mean()
Out[23]:
B
A
a 0 0.000000
2 1.333333
b 1 1.000000
3 2.333333
Additionally mean supports execution via Numba with the engine and engine_kwargs arguments. Numba must be installed as an optional dependency to use this feature.
Other enhancements#
- Added
day_of_week(compatibility aliasdayofweek) property to Timestamp, DatetimeIndex, Period, PeriodIndex (GH 9605) - Added
day_of_year(compatibility aliasdayofyear) property to Timestamp, DatetimeIndex, Period, PeriodIndex (GH 9605) - Added set_flags() for setting table-wide flags on a Series or DataFrame (GH 28394)
DataFrame.applymap()now supportsna_action(GH 23803)- Index with object dtype supports division and multiplication (GH 34160)
io.sql.get_schema()now supports aschemakeyword argument that will add a schema into the create table statement (GH 28486)- DataFrame.explode() and Series.explode() now support exploding of sets (GH 35614)
- DataFrame.hist() now supports time series (datetime) data (GH 32590)
- Styler.set_table_styles() now allows the direct styling of rows and columns and can be chained (GH 35607)
- Styler now allows direct CSS class name addition to individual data cells (GH 36159)
- Rolling.mean() and Rolling.sum() use Kahan summation to calculate the mean to avoid numerical problems (GH 10319, GH 11645, GH 13254, GH 32761, GH 36031)
DatetimeIndex.searchsorted(),TimedeltaIndex.searchsorted(),PeriodIndex.searchsorted(), and Series.searchsorted() with datetime-like dtypes will now try to cast string arguments (list-like and scalar) to the matching datetime-like type (GH 36346)- Added methods
IntegerArray.prod(),IntegerArray.min(), andIntegerArray.max()(GH 33790) - Calling a NumPy ufunc on a
DataFramewith extension types now preserves the extension types when possible (GH 23743) - Calling a binary-input NumPy ufunc on multiple
DataFrameobjects now aligns, matching the behavior of binary operations and ufuncs onSeries(GH 23743). This change has been reverted in pandas 1.2.1, and the behaviour to not align DataFrames is deprecated instead, see the the 1.2.1 release notes. - Where possible
RangeIndex.difference()andRangeIndex.symmetric_difference()will return RangeIndex instead ofInt64Index(GH 36564) - DataFrame.to_parquet() now supports MultiIndex for columns in parquet format (GH 34777)
- read_parquet() gained a
use_nullable_dtypes=Trueoption to use nullable dtypes that usepd.NAas missing value indicator where possible for the resulting DataFrame (default isFalse, and only applicable forengine="pyarrow") (GH 31242) - Added Rolling.sem() and
Expanding.sem()to compute the standard error of the mean (GH 26476) - Rolling.var() and Rolling.std() use Kahan summation and Welford’s Method to avoid numerical issues (GH 37051)
- DataFrame.corr() and DataFrame.cov() use Welford’s Method to avoid numerical issues (GH 37448)
- DataFrame.plot() now recognizes
xlabelandylabelarguments for plots of typescatterandhexbin(GH 37001) - DataFrame now supports the
divmodoperation (GH 37165) - DataFrame.to_parquet() now returns a
bytesobject when nopathargument is passed (GH 37105) Rollingnow supports theclosedargument for fixed windows (GH 34315)- DatetimeIndex and Series with
datetime64ordatetime64tzdtypes now supportstd(GH 37436) Windownow supports all Scipy window types inwin_typewith flexible keyword argument support (GH 34556)- testing.assert_index_equal() now has a
check_orderparameter that allows indexes to be checked in an order-insensitive manner (GH 37478) - read_csv() supports memory-mapping for compressed files (GH 37621)
- Add support for
min_countkeyword for DataFrame.groupby() and DataFrame.resample() for functionsmin,max,firstandlast(GH 37821, GH 37768) - Improve error reporting for DataFrame.merge() when invalid merge column definitions were given (GH 16228)
- Improve numerical stability for Rolling.skew(), Rolling.kurt(),
Expanding.skew()andExpanding.kurt()through implementation of Kahan summation (GH 6929) - Improved error reporting for subsetting columns of a
DataFrameGroupBywithaxis=1(GH 37725) - Implement method
crossfor DataFrame.merge() and DataFrame.join() (GH 5401) - When read_csv(), read_sas() and read_json() are called with
chunksize/iteratorthey can be used in awithstatement as they return context-managers (GH 38225) - Augmented the list of named colors available for styling Excel exports, enabling all of CSS4 colors (GH 38247)
Notable bug fixes#
These are bug fixes that might have notable behavior changes.
Consistency of DataFrame Reductions#
DataFrame.any() and DataFrame.all() with bool_only=True now determines whether to exclude object-dtype columns on a column-by-column basis, instead of checking if all object-dtype columns can be considered boolean.
This prevents pathological behavior where applying the reduction on a subset of columns could result in a larger Series result. See (GH 37799).
In [24]: df = pd.DataFrame({"A": ["foo", "bar"], "B": [True, False]}, dtype=object)
In [25]: df["C"] = pd.Series([True, True])
Previous behavior:
In [5]: df.all(bool_only=True) Out[5]: C True dtype: bool
In [6]: df[["B", "C"]].all(bool_only=True) Out[6]: B False C True dtype: bool
New behavior:
In [26]: In [5]: df.all(bool_only=True) Out[26]: C True dtype: bool
In [27]: In [6]: df[["B", "C"]].all(bool_only=True) Out[27]: C True dtype: bool
Other DataFrame reductions with numeric_only=None will also avoid this pathological behavior (GH 37827):
In [28]: df = pd.DataFrame({"A": [0, 1, 2], "B": ["a", "b", "c"]}, dtype=object)
Previous behavior:
In [3]: df.mean() Out[3]: Series([], dtype: float64)
In [4]: df[["A"]].mean() Out[4]: A 1.0 dtype: float64
New behavior:
In [3]: df.mean() Out[3]: A 1.0 dtype: float64
In [4]: df[["A"]].mean() Out[4]: A 1.0 dtype: float64
Moreover, DataFrame reductions with numeric_only=None will now be consistent with their Series counterparts. In particular, for reductions where the Series method raises TypeError, the DataFrame reduction will now consider that column non-numeric instead of casting to a NumPy array which may have different semantics (GH 36076,GH 28949, GH 21020).
In [29]: ser = pd.Series([0, 1], dtype="category", name="A")
In [30]: df = ser.to_frame()
Previous behavior:
In [5]: df.any() Out[5]: A True dtype: bool
New behavior:
In [5]: df.any() Out[5]: Series([], dtype: bool)
Increased minimum version for Python#
pandas 1.2.0 supports Python 3.7.1 and higher (GH 35214).
Increased minimum versions for dependencies#
Some minimum supported versions of dependencies were updated (GH 35214). If installed, we now require:
For optional libraries the general recommendation is to use the latest version. The following table lists the lowest version per library that is currently being tested throughout the development of pandas. Optional libraries below the lowest tested version may still work, but are not considered supported.
See Dependencies and Optional dependencies for more.
Other API changes#
- Sorting in descending order is now stable for Series.sort_values() and Index.sort_values() for Datetime-like Index subclasses. This will affect sort order when sorting a DataFrame on multiple columns, sorting with a key function that produces duplicates, or requesting the sorting index when using Index.sort_values(). When using Series.value_counts(), the count of missing values is no longer necessarily last in the list of duplicate counts. Instead, its position corresponds to the position in the original Series. When using Index.sort_values() for Datetime-like Index subclasses, NaTs ignored the
na_positionargument and were sorted to the beginning. Now they respectna_position, the default beinglast, same as other Index subclasses (GH 35992) - Passing an invalid
fill_valuetoCategorical.take(),DatetimeArray.take(),TimedeltaArray.take(), orPeriodArray.take()now raises aTypeErrorinstead of aValueError(GH 37733) - Passing an invalid
fill_valueto Series.shift() with aCategoricalDtypenow raises aTypeErrorinstead of aValueError(GH 37733) - Passing an invalid value to
IntervalIndex.insert()orCategoricalIndex.insert()now raises aTypeErrorinstead of aValueError(GH 37733) - Attempting to reindex a Series with a CategoricalIndex with an invalid
fill_valuenow raises aTypeErrorinstead of aValueError(GH 37733) - CategoricalIndex.append() with an index that contains non-category values will now cast instead of raising
TypeError(GH 38098)
Deprecations#
- Deprecated parameter
inplacein MultiIndex.set_codes() and MultiIndex.set_levels() (GH 35626) - Deprecated parameter
dtypeof method copy() for all Index subclasses. Use the astype() method instead for changing dtype (GH 35853) - Deprecated parameters
levelsandcodesin MultiIndex.copy(). Use the set_levels() and set_codes() methods instead (GH 36685) - Date parser functions
parse_date_time(),parse_date_fields(),parse_all_fields()andgeneric_parser()frompandas.io.date_convertersare deprecated and will be removed in a future version; use to_datetime() instead (GH 35741) DataFrame.lookup()is deprecated and will be removed in a future version, use DataFrame.melt() and DataFrame.loc() instead (GH 35224)- The method
Index.to_native_types()is deprecated. Use.astype(str)instead (GH 28867) - Deprecated indexing DataFrame rows with a single datetime-like string as
df[string](given the ambiguity whether it is indexing the rows or selecting a column), usedf.loc[string]instead (GH 36179) - Deprecated
Index.is_all_dates()(GH 27744) - The default value of
regexfor Series.str.replace() will change fromTruetoFalsein a future release. In addition, single character regular expressions will not be treated as literal strings whenregex=Trueis set (GH 24804) - Deprecated automatic alignment on comparison operations between DataFrame and Series, do
frame, ser = frame.align(ser, axis=1, copy=False)before e.g.frame == ser(GH 28759) Rolling.count()withmin_periods=Nonewill default to the size of the window in a future version (GH 31302)- Using “outer” ufuncs on DataFrames to return 4d ndarray is now deprecated. Convert to an ndarray first (GH 23743)
- Deprecated slice-indexing on tz-aware DatetimeIndex with naive
datetimeobjects, to match scalar indexing behavior (GH 36148) - Index.ravel() returning a
np.ndarrayis deprecated, in the future this will return a view on the same index (GH 19956) - Deprecate use of strings denoting units with ‘M’, ‘Y’ or ‘y’ in to_timedelta() (GH 36666)
- Index methods
&,|, and^behaving as the set operations Index.intersection(), Index.union(), and Index.symmetric_difference(), respectively, are deprecated and in the future will behave as pointwise boolean operations matching Series behavior. Use the named set methods instead (GH 36758) Categorical.is_dtype_equal()andCategoricalIndex.is_dtype_equal()are deprecated, will be removed in a future version (GH 37545)Series.slice_shift()andDataFrame.slice_shift()are deprecated, use Series.shift() or DataFrame.shift() instead (GH 37601)- Partial slicing on unordered DatetimeIndex objects with keys that are not in the index is deprecated and will be removed in a future version (GH 18531)
- The
howkeyword inPeriodIndex.astype()is deprecated and will be removed in a future version, useindex.to_timestamp(how=how)instead (GH 37982) - Deprecated
Index.asi8()for Index subclasses other than DatetimeIndex, TimedeltaIndex, and PeriodIndex (GH 37877) - The
inplaceparameter of Categorical.remove_unused_categories() is deprecated and will be removed in a future version (GH 37643) - The
null_countsparameter of DataFrame.info() is deprecated and replaced byshow_counts. It will be removed in a future version (GH 37999)
Calling NumPy ufuncs on non-aligned DataFrames
Calling NumPy ufuncs on non-aligned DataFrames changed behaviour in pandas 1.2.0 (to align the inputs before calling the ufunc), but this change is reverted in pandas 1.2.1. The behaviour to not align is now deprecated instead, see the the 1.2.1 release notes for more details.
Performance improvements#
- Performance improvements when creating DataFrame or Series with dtype
stror StringDtype from array with many string elements (GH 36304, GH 36317, GH 36325, GH 36432, GH 37371) - Performance improvement in DataFrameGroupBy.agg() and SeriesGroupBy.agg() with the
numbaengine (GH 35759) - Performance improvements when creating Series.map() from a huge dictionary (GH 34717)
- Performance improvement in DataFrameGroupBy.transform() and SeriesGroupBy.transform() with the
numbaengine (GH 36240) - Styler uuid method altered to compress data transmission over web whilst maintaining reasonably low table collision probability (GH 36345)
- Performance improvement in to_datetime() with non-ns time unit for
floatdtypecolumns (GH 20445) - Performance improvement in setting values on an
IntervalArray(GH 36310) - The internal index method
_shallow_copy()now makes the new index and original index share cached attributes, avoiding creating these again, if created on either. This can speed up operations that depend on creating copies of existing indexes (GH 36840) - Performance improvement in
RollingGroupby.count()(GH 35625) - Small performance decrease to Rolling.min() and Rolling.max() for fixed windows (GH 36567)
- Reduced peak memory usage in DataFrame.to_pickle() when using
protocol=5in python 3.8+ (GH 34244) - Faster
dircalls when the object has many index labels, e.g.dir(ser)(GH 37450) - Performance improvement in
ExpandingGroupby(GH 37064) - Performance improvement in Series.astype() and DataFrame.astype() for Categorical (GH 8628)
- Performance improvement in DataFrame.groupby() for
floatdtype(GH 28303), changes of the underlying hash-function can lead to changes in float based indexes sort ordering for ties (e.g. Index.value_counts()) - Performance improvement in
pd.isin()for inputs with more than 1e6 elements (GH 36611) - Performance improvement for
DataFrame.__setitem__()with list-like indexers (GH 37954) - read_json() now avoids reading entire file into memory when chunksize is specified (GH 34548)
Bug fixes#
Categorical#
Categorical.fillna()will always return a copy, validate a passed fill value regardless of whether there are any NAs to fill, and disallow anNaTas a fill value for numeric categories (GH 36530)- Bug in
Categorical.__setitem__()that incorrectly raised when trying to set a tuple value (GH 20439) - Bug in CategoricalIndex.equals() incorrectly casting non-category entries to
np.nan(GH 37667) - Bug in
CategoricalIndex.where()incorrectly setting non-category entries tonp.naninstead of raisingTypeError(GH 37977) - Bug in
Categorical.to_numpy()andnp.array(categorical)with tz-awaredatetime64categories incorrectly dropping the time zone information instead of casting to object dtype (GH 38136)
Datetime-like#
- Bug in DataFrame.combine_first() that would convert datetime-like column on other DataFrame to integer when the column is not present in original DataFrame (GH 28481)
- Bug in
DatetimeArray.datewhere aValueErrorwould be raised with a read-only backing array (GH 33530) - Bug in
NaTcomparisons failing to raiseTypeErroron invalid inequality comparisons (GH 35046) - Bug in DateOffset where attributes reconstructed from pickle files differ from original objects when input values exceed normal ranges (e.g. months=12) (GH 34511)
- Bug in
DatetimeIndex.get_slice_bound()wheredatetime.dateobjects were not accepted or naive Timestamp with a tz-aware DatetimeIndex (GH 35690) - Bug in
DatetimeIndex.slice_locs()wheredatetime.dateobjects were not accepted (GH 34077) - Bug in
DatetimeIndex.searchsorted(),TimedeltaIndex.searchsorted(),PeriodIndex.searchsorted(), and Series.searchsorted() withdatetime64,timedelta64or Period dtype placement ofNaTvalues being inconsistent with NumPy (GH 36176, GH 36254) - Inconsistency in DatetimeArray, TimedeltaArray, and PeriodArray method
__setitem__casting arrays of strings to datetime-like scalars but not scalar strings (GH 36261) - Bug in
DatetimeArray.take()incorrectly allowingfill_valuewith a mismatched time zone (GH 37356) - Bug in
DatetimeIndex.shiftincorrectly raising when shifting empty indexes (GH 14811) - Timestamp and DatetimeIndex comparisons between tz-aware and tz-naive objects now follow the standard library
datetimebehavior, returningTrue/Falsefor!=/==and raising for inequality comparisons (GH 28507) - Bug in
DatetimeIndex.equals()andTimedeltaIndex.equals()incorrectly consideringint64indexes as equal (GH 36744) - Series.to_json(), DataFrame.to_json(), and read_json() now implement time zone parsing when orient structure is
table(GH 35973) astype()now attempts to convert todatetime64[ns, tz]directly fromobjectwith inferred time zone from string (GH 35973)- Bug in
TimedeltaIndex.sum()and Series.sum() withtimedelta64dtype on an empty index or series returningNaTinstead ofTimedelta(0)(GH 31751) - Bug in
DatetimeArray.shift()incorrectly allowingfill_valuewith a mismatched time zone (GH 37299) - Bug in adding a BusinessDay with nonzero
offsetto a non-scalar other (GH 37457) - Bug in to_datetime() with a read-only array incorrectly raising (GH 34857)
- Bug in Series.isin() with
datetime64[ns]dtype andDatetimeIndex.isin()incorrectly casting integers to datetimes (GH 36621) - Bug in Series.isin() with
datetime64[ns]dtype andDatetimeIndex.isin()failing to consider tz-aware and tz-naive datetimes as always different (GH 35728) - Bug in Series.isin() with
PeriodDtypedtype andPeriodIndex.isin()failing to consider arguments with differentPeriodDtypeas always different (GH 37528) - Bug in Period constructor now correctly handles nanoseconds in the
valueargument (GH 34621 and GH 17053)
Timedelta#
- Bug in TimedeltaIndex, Series, and DataFrame floor-division with
timedelta64dtypes andNaTin the denominator (GH 35529) - Bug in parsing of ISO 8601 durations in Timedelta and to_datetime() (GH 29773, GH 36204)
- Bug in to_timedelta() with a read-only array incorrectly raising (GH 34857)
- Bug in Timedelta incorrectly truncating to sub-second portion of a string input when it has precision higher than nanoseconds (GH 36738)
Timezones#
- Bug in date_range() was raising
AmbiguousTimeErrorfor valid input withambiguous=False(GH 35297) - Bug in Timestamp.replace() was losing fold information (GH 37610)
Numeric#
- Bug in to_numeric() where float precision was incorrect (GH 31364)
- Bug in DataFrame.any() with
axis=1andbool_only=Trueignoring thebool_onlykeyword (GH 32432) - Bug in Series.equals() where a
ValueErrorwas raised when NumPy arrays were compared to scalars (GH 35267) - Bug in Series where two Series each have a DatetimeIndex with different time zones having those indexes incorrectly changed when performing arithmetic operations (GH 33671)
- Bug in
pandas.testingmodule functions when used withcheck_exact=Falseon complex numeric types (GH 28235) - Bug in
DataFrame.__rmatmul__()error handling reporting transposed shapes (GH 21581) - Bug in Series flex arithmetic methods where the result when operating with a
list,tupleornp.ndarraywould have an incorrect name (GH 36760) - Bug in IntegerArray multiplication with
timedeltaandnp.timedelta64objects (GH 36870) - Bug in MultiIndex comparison with tuple incorrectly treating tuple as array-like (GH 21517)
- Bug in DataFrame.diff() with
datetime64dtypes includingNaTvalues failing to fillNaTresults correctly (GH 32441) - Bug in DataFrame arithmetic ops incorrectly accepting keyword arguments (GH 36843)
- Bug in IntervalArray comparisons with Series not returning Series (GH 36908)
- Bug in DataFrame allowing arithmetic operations with list of array-likes with undefined results. Behavior changed to raising
ValueError(GH 36702) - Bug in DataFrame.std() with
timedelta64dtype andskipna=False(GH 37392) - Bug in DataFrame.min() and DataFrame.max() with
datetime64dtype andskipna=False(GH 36907) - Bug in DataFrame.idxmax() and DataFrame.idxmin() with mixed dtypes incorrectly raising
TypeError(GH 38195)
Conversion#
- Bug in DataFrame.to_dict() with
orient='records'now returns python native datetime objects for datetime-like columns (GH 21256) - Bug in Series.astype() conversion from
stringtofloatraised in presence ofpd.NAvalues (GH 37626)
Strings#
- Bug in Series.to_string(), DataFrame.to_string(), and DataFrame.to_latex() adding a leading space when
index=False(GH 24980) - Bug in to_numeric() raising a
TypeErrorwhen attempting to convert a string dtype Series containing only numeric strings andNA(GH 37262)
Interval#
- Bug in DataFrame.replace() and Series.replace() where Interval dtypes would be converted to object dtypes (GH 34871)
- Bug in
IntervalIndex.take()with negative indices andfill_value=None(GH 37330) - Bug in
IntervalIndex.putmask()with datetime-like dtype incorrectly casting to object dtype (GH 37968) - Bug in
IntervalArray.astype()incorrectly dropping dtype information with a CategoricalDtype object (GH 37984)
Indexing#
- Bug in
PeriodIndex.get_loc()incorrectly raisingValueErroron non-datelike strings instead ofKeyError, causing similar errors inSeries.__getitem__(),Series.__contains__(), andSeries.loc.__getitem__()(GH 34240) - Bug in Index.sort_values() where, when empty values were passed, the method would break by trying to compare missing values instead of pushing them to the end of the sort order (GH 35584)
- Bug in Index.get_indexer() and Index.get_indexer_non_unique() where
int64arrays are returned instead ofintp(GH 36359) - Bug in DataFrame.sort_index() where parameter ascending passed as a list on a single level index gives wrong result (GH 32334)
- Bug in DataFrame.reset_index() was incorrectly raising a
ValueErrorfor input with a MultiIndex with missing values in a level withCategoricaldtype (GH 24206) - Bug in indexing with boolean masks on datetime-like values sometimes returning a view instead of a copy (GH 36210)
- Bug in
DataFrame.__getitem__()andDataFrame.loc.__getitem__()with IntervalIndex columns and a numeric indexer (GH 26490) - Bug in
Series.loc.__getitem__()with a non-unique MultiIndex and an empty-list indexer (GH 13691) - Bug in indexing on a Series or DataFrame with a MultiIndex and a level named
"0"(GH 37194) - Bug in
Series.__getitem__()when using an unsigned integer array as an indexer giving incorrect results or segfaulting instead of raisingKeyError(GH 37218) - Bug in Index.where() incorrectly casting numeric values to strings (GH 37591)
- Bug in DataFrame.loc() returning empty result when indexer is a slice with negative step size (GH 38071)
- Bug in Series.loc() and DataFrame.loc() raises when the index was of
objectdtype and the given numeric label was in the index (GH 26491) - Bug in DataFrame.loc() returned requested key plus missing values when
locwas applied to single level from a MultiIndex (GH 27104) - Bug in indexing on a Series or DataFrame with a CategoricalIndex using a list-like indexer containing NA values (GH 37722)
- Bug in
DataFrame.loc.__setitem__()expanding an empty DataFrame with mixed dtypes (GH 37932) - Bug in DataFrame.xs() ignored
droplevel=Falsefor columns (GH 19056) - Bug in DataFrame.reindex() raising
IndexingErrorwrongly for empty DataFrame withtolerancenotNoneormethod="nearest"(GH 27315) - Bug in indexing on a Series or DataFrame with a CategoricalIndex using list-like indexer that contains elements that are in the index’s
categoriesbut not in the index itself failing to raiseKeyError(GH 37901) - Bug on inserting a boolean label into a DataFrame with a numeric Index columns incorrectly casting to integer (GH 36319)
- Bug in DataFrame.iloc() and Series.iloc() aligning objects in
__setitem__(GH 22046) - Bug in MultiIndex.drop() does not raise if labels are partially found (GH 37820)
- Bug in DataFrame.loc() did not raise
KeyErrorwhen missing combination was given withslice(None)for remaining levels (GH 19556) - Bug in DataFrame.loc() raising
TypeErrorwhen non-integer slice was given to select values from MultiIndex (GH 25165, GH 24263) - Bug in Series.at() returning Series with one element instead of scalar when index is a MultiIndex with one level (GH 38053)
- Bug in DataFrame.loc() returning and assigning elements in wrong order when indexer is differently ordered than the MultiIndex to filter (GH 31330, GH 34603)
- Bug in DataFrame.loc() and
DataFrame.__getitem__()raisingKeyErrorwhen columns were MultiIndex with only one level (GH 29749) - Bug in
Series.__getitem__()andDataFrame.__getitem__()raising blankKeyErrorwithout missing keys for IntervalIndex (GH 27365) - Bug in setting a new label on a DataFrame or Series with a CategoricalIndex incorrectly raising
TypeErrorwhen the new label is not among the index’s categories (GH 38098) - Bug in Series.loc() and Series.iloc() raising
ValueErrorwhen inserting a list-likenp.array,listortuplein anobjectSeries of equal length (GH 37748, GH 37486) - Bug in Series.loc() and Series.iloc() setting all the values of an
objectSeries with those of a list-likeExtensionArrayinstead of inserting it (GH 38271)
Missing#
- Bug in SeriesGroupBy.transform() now correctly handles missing values for
dropna=False(GH 35014) - Bug in Series.nunique() with
dropna=Truewas returning incorrect results when bothNAandNonemissing values were present (GH 37566) - Bug in Series.interpolate() where kwarg
limit_areaandlimit_directionhad no effect when using methodspadandbackfill(GH 31048)
MultiIndex#
- Bug in DataFrame.xs() when used with IndexSlice raises
TypeErrorwith message"Expected label or tuple of labels"(GH 35301) - Bug in DataFrame.reset_index() with
NaTvalues in index raisesValueErrorwith message"cannot convert float NaN to integer"(GH 36541) - Bug in DataFrame.combine_first() when used with MultiIndex containing string and
NaNvalues raisesTypeError(GH 36562) - Bug in MultiIndex.drop() dropped
NaNvalues when non existing key was given as input (GH 18853) - Bug in MultiIndex.drop() dropping more values than expected when index has duplicates and is not sorted (GH 33494)
I/O#
- read_sas() no longer leaks resources on failure (GH 35566)
- Bug in DataFrame.to_csv() and Series.to_csv() caused a
ValueErrorwhen it was called with a filename in combination withmodecontaining ab(GH 35058) - Bug in read_csv() with
float_precision='round_trip'did not handledecimalandthousandsparameters (GH 35365) to_pickle()and read_pickle() were closing user-provided file objects (GH 35679)to_csv()passes compression arguments for'gzip'always togzip.GzipFile(GH 28103)to_csv()did not support zip compression for binary file object not having a filename (GH 35058)to_csv()and read_csv() did not honorcompressionandencodingfor path-like objects that are internally converted to file-like objects (GH 35677, GH 26124, GH 32392)- DataFrame.to_pickle(), Series.to_pickle(), and read_pickle() did not support compression for file-objects (GH 26237, GH 29054, GH 29570)
- Bug in
LongTableBuilder.middle_separator()was duplicating LaTeX longtable entries in the List of Tables of a LaTeX document (GH 34360) - Bug in read_csv() with
engine='python'truncating data if multiple items present in first row and first element started with BOM (GH 36343) - Removed
private_keyandverbosefromread_gbq()as they are no longer supported inpandas-gbq(GH 34654, GH 30200) - Bumped minimum pytables version to 3.5.1 to avoid a
ValueErrorin read_hdf() (GH 24839) - Bug in read_table() and read_csv() when
delim_whitespace=Trueandsep=default(GH 36583) - Bug in DataFrame.to_json() and Series.to_json() when used with
lines=Trueandorient='records'the last line of the record is not appended with ‘new line character’ (GH 36888) - Bug in read_parquet() with fixed offset time zones. String representation of time zones was not recognized (GH 35997, GH 36004)
- Bug in DataFrame.to_html(), DataFrame.to_string(), and DataFrame.to_latex() ignoring the
na_repargument whenfloat_formatwas also specified (GH 9046, GH 13828) - Bug in output rendering of complex numbers showing too many trailing zeros (GH 36799)
- Bug in
HDFStorethrew aTypeErrorwhen exporting an empty DataFrame withdatetime64[ns, tz]dtypes with a fixed HDF5 store (GH 20594) - Bug in
HDFStorewas dropping time zone information when exporting a Series withdatetime64[ns, tz]dtypes with a fixed HDF5 store (GH 20594) - read_csv() was closing user-provided binary file handles when
engine="c"and anencodingwas requested (GH 36980) - Bug in DataFrame.to_hdf() was not dropping missing rows with
dropna=True(GH 35719) - Bug in read_html() was raising a
TypeErrorwhen supplying apathlib.Pathargument to theioparameter (GH 37705) - DataFrame.to_excel(), Series.to_excel(), DataFrame.to_markdown(), and Series.to_markdown() now support writing to fsspec URLs such as S3 and Google Cloud Storage (GH 33987)
- Bug in read_fwf() with
skip_blank_lines=Truewas not skipping blank lines (GH 37758) - Parse missing values using read_json() with
dtype=FalsetoNaNinstead ofNone(GH 28501) - read_fwf() was inferring compression with
compression=Nonewhich was not consistent with the otherread_*functions (GH 37909) - DataFrame.to_html() was ignoring
formattersargument forExtensionDtypecolumns (GH 36525) - Bumped minimum xarray version to 0.12.3 to avoid reference to the removed
Panelclass (GH 27101, GH 37983) - DataFrame.to_csv() was re-opening file-like handles that also implement
os.PathLike(GH 38125) - Bug in the conversion of a sliced
pyarrow.Tablewith missing values to a DataFrame (GH 38525) - Bug in read_sql_table() raising a
sqlalchemy.exc.OperationalErrorwhen column names contained a percentage sign (GH 37517)
Period#
- Bug in DataFrame.replace() and Series.replace() where Period dtypes would be converted to object dtypes (GH 34871)
Plotting#
- Bug in DataFrame.plot() was rotating xticklabels when
subplots=True, even if the x-axis wasn’t an irregular time series (GH 29460) - Bug in DataFrame.plot() where a marker letter in the
stylekeyword sometimes caused aValueError(GH 21003) - Bug in DataFrame.plot.bar() and Series.plot.bar() where ticks positions were assigned by value order instead of using the actual value for numeric or a smart ordering for string (GH 26186, GH 11465). This fix has been reverted in pandas 1.2.1, see What’s new in 1.2.1 (January 20, 2021)
- Twinned axes were losing their tick labels which should only happen to all but the last row or column of ‘externally’ shared axes (GH 33819)
- Bug in Series.plot() and DataFrame.plot() was throwing a ValueError when the Series or DataFrame was indexed by a TimedeltaIndex with a fixed frequency and the x-axis lower limit was greater than the upper limit (GH 37454)
- Bug in DataFrameGroupBy.boxplot() when
subplots=Falsewould raise aKeyError(GH 16748) - Bug in DataFrame.plot() and Series.plot() was overwriting matplotlib’s shared y axes behavior when no
shareyparameter was passed (GH 37942) - Bug in DataFrame.plot() was raising a
TypeErrorwithExtensionDtypecolumns (GH 32073)
Styler#
- Bug in
Styler.render()HTML was generated incorrectly because of formatting error inrowspanattribute, it now matches with w3 syntax (GH 38234)
Groupby/resample/rolling#
- Bug in DataFrameGroupBy.count() and
SeriesGroupBy.sum()returningNaNfor missing categories when grouped on multipleCategoricals. Now returning0(GH 35028) - Bug in DataFrameGroupBy.apply() that would sometimes throw an erroneous
ValueErrorif the grouping axis had duplicate entries (GH 16646) - Bug in DataFrame.resample() that would throw a
ValueErrorwhen resampling from"D"to"24H"over a transition into daylight savings time (DST) (GH 35219) - Bug when combining methods DataFrame.groupby() with DataFrame.resample() and DataFrame.interpolate() raising a
TypeError(GH 35325) - Bug in DataFrameGroupBy.apply() where a non-nuisance grouping column would be dropped from the output columns if another groupby method was called before
.apply(GH 34656) - Bug when subsetting columns on a
DataFrameGroupBy(e.g.df.groupby('a')[['b']]) would reset the attributesaxis,dropna,group_keys,level,mutated,sort, andsqueezeto their default values (GH 9959) - Bug in
DataFrameGroupBy.tshift()failing to raiseValueErrorwhen a frequency cannot be inferred for the index of a group (GH 35937) - Bug in DataFrame.groupby() does not always maintain column index name for
any,all,bfill,ffill,shift(GH 29764) - Bug in DataFrameGroupBy.apply() raising error with
np.nangroup(s) whendropna=False(GH 35889) - Bug in Rolling.sum() returned wrong values when dtypes where mixed between float and integer and
axis=1(GH 20649, GH 35596) - Bug in Rolling.count() returned
np.nanwith FixedForwardWindowIndexer as window,min_periods=0and only missing values in the window (GH 35579) - Bug where
Rollingproduces incorrect window sizes when using aPeriodIndex(GH 34225) - Bug in DataFrameGroupBy.ffill() and DataFrameGroupBy.bfill() where a
NaNgroup would return filled values instead ofNaNwhendropna=True(GH 34725) - Bug in
RollingGroupby.count()where aValueErrorwas raised when specifying theclosedparameter (GH 35869) - Bug in DataFrameGroupBy.rolling() returning wrong values with partial centered window (GH 36040)
- Bug in DataFrameGroupBy.rolling() returned wrong values with time aware window containing
NaN. RaisesValueErrorbecause windows are not monotonic now (GH 34617) - Bug in
Rolling.__iter__()where aValueErrorwas not raised whenmin_periodswas larger thanwindow(GH 37156) - Using Rolling.var() instead of Rolling.std() avoids numerical issues for Rolling.corr() when Rolling.var() is still within floating point precision while Rolling.std() is not (GH 31286)
- Bug in DataFrameGroupBy.quantile() and Resampler.quantile() raised
TypeErrorwhen values were of typeTimedelta(GH 29485) - Bug in Rolling.median() and Rolling.quantile() returned wrong values for BaseIndexer subclasses with non-monotonic starting or ending points for windows (GH 37153)
- Bug in DataFrame.groupby() dropped
nangroups from result withdropna=Falsewhen grouping over a single column (GH 35646, GH 35542) - Bug in DataFrameGroupBy.head(),
DataFrameGroupBy.tail(),SeriesGroupBy.head(), andSeriesGroupBy.tail()would raise when used withaxis=1(GH 9772) - Bug in DataFrameGroupBy.transform() would raise when used with
axis=1and a transformation kernel (e.g. “shift”) (GH 36308) - Bug in DataFrameGroupBy.resample() using
.aggwith sum produced different result than just calling.sum(GH 33548) - Bug in DataFrameGroupBy.apply() dropped values on
nangroup when returning the same axes with the original frame (GH 38227) - Bug in DataFrameGroupBy.quantile() couldn’t handle with arraylike
qwhen grouping by columns (GH 33795) - Bug in
DataFrameGroupBy.rank()withdatetime64tzor period dtype incorrectly casting results to those dtypes instead of returningfloat64dtype (GH 38187)
Reshaping#
- Bug in
DataFrame.crosstab()was returning incorrect results on inputs with duplicate row names, duplicate column names or duplicate names between row and column labels (GH 22529) - Bug in DataFrame.pivot_table() with
aggfunc='count'oraggfunc='sum'returningNaNfor missing categories when pivoted on aCategorical. Now returning0(GH 31422) - Bug in concat() and DataFrame constructor where input index names are not preserved in some cases (GH 13475)
- Bug in func crosstab() when using multiple columns with
margins=Trueandnormalize=True(GH 35144) - Bug in DataFrame.stack() where an empty DataFrame.stack would raise an error (GH 36113). Now returning an empty Series with empty MultiIndex.
- Bug in Series.unstack(). Now a Series with single level of Index trying to unstack would raise a
ValueError(GH 36113) - Bug in DataFrame.agg() with
func={'name':<FUNC>}incorrectly raisingTypeErrorwhenDataFrame.columns==['Name'](GH 36212) - Bug in Series.transform() would give incorrect results or raise when the argument
funcwas a dictionary (GH 35811) - Bug in DataFrame.pivot() did not preserve MultiIndex level names for columns when rows and columns are both multiindexed (GH 36360)
- Bug in DataFrame.pivot() modified
indexargument whencolumnswas passed butvalueswas not (GH 37635) - Bug in DataFrame.join() returned a non deterministic level-order for the resulting MultiIndex (GH 36910)
- Bug in DataFrame.combine_first() caused wrong alignment with dtype
stringand one level ofMultiIndexcontaining onlyNA(GH 37591) - Fixed regression in merge() on merging DatetimeIndex with empty DataFrame (GH 36895)
- Bug in DataFrame.apply() not setting index of return value when
funcreturn type isdict(GH 37544) - Bug in DataFrame.merge() and pandas.merge() returning inconsistent ordering in result for
how=rightandhow=left(GH 35382) - Bug in merge_ordered() couldn’t handle list-like
left_byorright_by(GH 35269) - Bug in merge_ordered() returned wrong join result when length of
left_byorright_byequals to the rows ofleftorright(GH 38166) - Bug in merge_ordered() didn’t raise when elements in
left_byorright_bynot exist inleftcolumns orrightcolumns (GH 38167) - Bug in DataFrame.drop_duplicates() not validating bool dtype for
ignore_indexkeyword (GH 38274)
ExtensionArray#
- Fixed bug where DataFrame column set to scalar extension type via a dict instantiation was considered an object type rather than the extension type (GH 35965)
- Fixed bug where
astype()with equal dtype andcopy=Falsewould return a new object (GH 28488) - Fixed bug when applying a NumPy ufunc with multiple outputs to an IntegerArray returning
None(GH 36913) - Fixed an inconsistency in PeriodArray’s
__init__signature to those of DatetimeArray and TimedeltaArray (GH 37289) - Reductions for BooleanArray, Categorical, DatetimeArray, FloatingArray, IntegerArray, PeriodArray, TimedeltaArray, and
PandasArrayare now keyword-only methods (GH 37541) - Fixed a bug where a
TypeErrorwas wrongly raised if a membership check was made on anExtensionArraycontaining nan-like values (GH 37867)
Other#
- Bug in DataFrame.replace() and Series.replace() incorrectly raising an
AssertionErrorinstead of aValueErrorwhen invalid parameter combinations are passed (GH 36045) - Bug in DataFrame.replace() and Series.replace() with numeric values and string
to_replace(GH 34789) - Fixed metadata propagation in Series.abs() and ufuncs called on Series and DataFrames (GH 28283)
- Bug in DataFrame.replace() and Series.replace() incorrectly casting from
PeriodDtypeto object dtype (GH 34871) - Fixed bug in metadata propagation incorrectly copying DataFrame columns as metadata when the column name overlaps with the metadata name (GH 37037)
- Fixed metadata propagation in the Series.dt, Series.str accessors, DataFrame.duplicated, DataFrame.stack, DataFrame.unstack, DataFrame.pivot,
DataFrame.append, DataFrame.diff,DataFrame.applymapand DataFrame.update methods (GH 28283, GH 37381) - Fixed metadata propagation when selecting columns with
DataFrame.__getitem__(GH 28283) - Bug in Index.intersection() with non-Index failing to set the correct name on the returned Index (GH 38111)
- Bug in
RangeIndex.intersection()failing to set the correct name on the returned Index in some corner cases (GH 38197) - Bug in Index.difference() failing to set the correct name on the returned Index in some corner cases (GH 38268)
- Bug in Index.union() behaving differently depending on whether operand is an Index or other list-like (GH 36384)
- Bug in Index.intersection() with non-matching numeric dtypes casting to
objectdtype instead of minimal common dtype (GH 38122) - Bug in
IntervalIndex.union()returning an incorrectly-typed Index when empty (GH 38282) - Passing an array with 2 or more dimensions to the Series constructor now raises the more specific
ValueErrorrather than a bareException(GH 35744) - Bug in
dirwheredir(obj)wouldn’t show attributes defined on the instance for pandas objects (GH 37173) - Bug in Index.drop() raising
InvalidIndexErrorwhen index has duplicates (GH 38051) - Bug in
RangeIndex.difference()returningInt64Indexin some cases where it should return RangeIndex (GH 38028) - Fixed bug in
assert_series_equal()when comparing a datetime-like array with an equivalent non extension dtype array (GH 37609) - Bug in is_bool_dtype() would raise when passed a valid string such as
"boolean"(GH 38386) - Fixed regression in logical operators raising
ValueErrorwhen columns of DataFrame are a CategoricalIndex with unused categories (GH 38367)
Contributors#
A total of 257 people contributed patches to this release. People with a “+” by their names contributed a patch for the first time.
- 21CSM +
- AbdulMAbdi +
- Abhiraj Hinge +
- Abhishek Mangla +
- Abo7atm +
- Adam Spannbauer +
- Albert Villanova del Moral
- Alex Kirko
- Alex Lim +
- Alex Thorne +
- Aleš Erjavec +
- Ali McMaster
- Amanda Dsouza +
- Amim Knabben +
- Andrew Wieteska
- Anshoo Rajput +
- Anthony Milbourne
- Arun12121 +
- Asish Mahapatra
- Avinash Pancham +
- BeanNan +
- Ben Forbes +
- Brendan Wilby +
- Bruno Almeida +
- Byron Boulton +
- Chankey Pathak
- Chris Barnes +
- Chris Lynch +
- Chris Withers
- Christoph Deil +
- Christopher Hadley +
- Chuanzhu Xu
- Coelhudo +
- Dan Moore
- Daniel Saxton
- David Kwong +
- David Li +
- David Mrva +
- Deepak Pandey +
- Deepyaman Datta
- Devin Petersohn
- Dmitriy Perepelkin +
- Douglas Hanley +
- Dāgs Grīnbergs +
- Eli Treuherz +
- Elliot Rampono +
- Erfan Nariman
- Eric Goddard
- Eric Leung +
- Eric Wieser
- Ethan Chen +
- Eve +
- Eyal Trabelsi +
- Fabian Gebhart +
- Fangchen Li
- Felix Claessen +
- Finlay Maguire +
- Florian Roscheck +
- Gabriel Monteiro
- Gautham +
- Gerard Jorgensen +
- Gregory Livschitz
- Hans
- Harsh Sharma
- Honfung Wong +
- Igor Gotlibovych +
- Iqrar Agalosi Nureyza
- Irv Lustig
- Isaac Virshup
- Jacob Peacock
- Jacob Stevens-Haas +
- Jan Müller +
- Janus
- Jeet Parekh
- Jeff Hernandez +
- Jeff Reback
- Jiaxiang
- Joao Pedro Berno Zanutto +
- Joel Nothman
- Joel Whittier +
- John Karasinski +
- John McGuigan +
- Johnny Pribyl +
- Jonas Laursen +
- Jonathan Shreckengost +
- Joris Van den Bossche
- Jose +
- JoseNavy +
- Josh Temple +
- Jun Kudo +
- Justin Essert
- Justin Sexton +
- Kaiqi Dong
- Kamil Trocewicz +
- Karthik Mathur
- Kashif +
- Kenny Huynh
- Kevin Sheppard
- Kumar Shivam +
- Leonardus Chen +
- Levi Matus +
- Lucas Rodés-Guirao +
- Luis Pinto +
- Lynch +
- Marc Garcia
- Marco Gorelli
- Maria-Alexandra Ilie +
- Marian Denes
- Mark Graham +
- Martin Durant
- Matt Roeschke
- Matthew Roeschke
- Matthias Bussonnier
- Maxim Ivanov +
- Mayank Chaudhary +
- MeeseeksMachine
- Meghana Varanasi +
- Metehan Kutlu +
- Micael Jarniac +
- Micah Smith +
- Michael Marino
- Miroslav Šedivý
- Mohammad Jafar Mashhadi
- Mohammed Kashif +
- Nagesh Kumar C +
- Nidhi Zare +
- Nikhil Choudhary +
- Number42
- Oleh Kozynets +
- OlivierLuG
- Pandas Development Team
- Paolo Lammens +
- Paul Ganssle
- Pax +
- Peter Liu +
- Philip Cerles +
- Pranjal Bhardwaj +
- Prayag Savsani +
- Purushothaman Srikanth +
- Qbiwan +
- Rahul Chauhan +
- Rahul Sathanapalli +
- Rajat Bishnoi +
- Ray Bell
- Reshama Shaikh +
- Richard Shadrach
- Robert Bradshaw
- Robert de Vries
- Rohith295
- S Mono +
- S.TAKENO +
- Sahid Velji +
- Sam Cohen +
- Sam Ezebunandu +
- Sander +
- Sarthak +
- Sarthak Vineet Kumar +
- Satrio H Wicaksono +
- Scott Lasley
- Shao Yang Hong +
- Sharon Woo +
- Shubham Mehra +
- Simon Hawkins
- Sixuan (Cherie) Wu +
- Souris Ash +
- Steffen Rehberg
- Suvayu Ali
- Sven
- SylvainLan +
- T. JEGHAM +
- Terji Petersen
- Thomas Dickson +
- Thomas Heavey +
- Thomas Smith
- Tobias Pitters
- Tom Augspurger
- Tomasz Sakrejda +
- Torsten Wörtwein +
- Ty Mick +
- UrielMaD +
- Uwe L. Korn
- Vikramaditya Gaonkar +
- VirosaLi +
- W.R +
- Warren White +
- Wesley Boelrijk +
- William Ayd
- Yanxian Lin +
- Yassir Karroum +
- Yong Kai Yi +
- Yuanhao Geng +
- Yury Mikhaylov +
- Yutaro Ikeda
- Yuya Takashina +
- Zach Brookler +
- Zak Kohler +
- ZhihuiChen0903 +
- abmyii
- alexhtn +
- asharma13524 +
- attack68
- beanan +
- chinhwee
- cleconte987
- danchev +
- ebardie +
- edwardkong
- elliot rampono +
- estasney +
- gabicca
- geetha-rangaswamaiah +
- gfyoung
- guru kiran
- hardikpnsp +
- icanhazcodeplz +
- ivanovmg +
- jbrockmendel
- jeschwar
- jnecus
- joooeey +
- junk +
- krajatcl +
- lacrosse91 +
- leo +
- lpkirwin +
- lrjball
- lucasrodes +
- ma3da +
- mavismonica +
- mlondschien +
- mzeitlin11 +
- nguevara +
- nrebena
- parkdj1 +
- partev
- patrick
- realead
- rxxg +
- samilAyoub +
- sanderland
- shawnbrown
- sm1899 +
- smartvinnetou
- ssortman +
- steveya +
- taytzehao +
- tiagohonorato +
- timhunderwood
- tkmz-n +
- tnwei +
- tpanza +
- vineethraj510 +
- vmdhhh +
- xinrong-databricks +
- yonas kassa +
- yonashub +
- Ádám Lippai +