0.21.0版(2017年10月27日)#
这是从0.20.3开始的一个主要版本,包括许多API更改、弃用、新功能、增强功能和性能改进,以及大量的错误修复。我们建议所有用户升级到此版本。
亮点包括:
与 Apache Parquet ,包括一个新的顶层
read_parquet()函数和DataFrame.to_parquet()方法,请参见 here 。面向新用户
pandas.api.types.CategoricalDtype有关独立于数据指定类别的信息,请参见 here 。的行为
sumandprodon all-NaN Series/DataFrames is now consistent and no longer depends on whether bottleneck 已安装,并且sum和prod在空系列上,现在返回NaN而不是0,请参见 here 。PyPy的兼容性修复,请参见 here 。
添加到
drop,reindex和renameAPI以使它们更一致,请参见 here 。新方法的添加
DataFrame.infer_objects(请参阅 here )和GroupBy.pipe(请参阅 here )。不建议使用缺少一个或多个标签的标签列表进行索引,这将在将来的版本中引发KeyError,请参见 here 。
检查 API Changes 和 deprecations 在更新之前。
V0.21.0中的新特性
新功能#
与ApacheParquet文件格式集成#
Integration with Apache Parquet, including a new top-level read_parquet() and DataFrame.to_parquet() method, see here (GH15838, GH17438).
Apache Parquet 提供一种跨语言的二进制文件格式,用于高效地读写数据帧。拼花被设计成忠实地序列化和反序列化 DataFrame S,支持所有Pandas数据类型,包括扩展数据类型,如带时区的DateTime。
此功能取决于 pyarrow 或 fastparquet 类库。有关更多详细信息,请参阅 the IO docs on Parquet 。
方法 infer_objects 类型转换#
这个 DataFrame.infer_objects() 和 Series.infer_objects() 添加了对对象列执行数据类型推断的方法,取代了已弃用的 convert_objects 方法。请参阅文档 here 了解更多详细信息。 (GH11221 )
此方法仅对对象列执行软转换,将Python对象转换为本机类型,但不执行任何强制转换。例如:
In [1]: df = pd.DataFrame({'A': [1, 2, 3],
...: 'B': np.array([1, 2, 3], dtype='object'),
...: 'C': ['1', '2', '3']})
...:
In [2]: df.dtypes
Out[2]:
A int64
B object
C object
Length: 3, dtype: object
In [3]: df.infer_objects().dtypes
Out[3]:
A int64
B int64
C object
Length: 3, dtype: object
请注意,该栏 'C' 未转换-仅标量数值类型将转换为新类型。其他类型的转换应使用 to_numeric() 函数(或 to_datetime() , to_timedelta() )。
In [4]: df = df.infer_objects()
In [5]: df['C'] = pd.to_numeric(df['C'], errors='coerce')
In [6]: df.dtypes
Out[6]:
A int64
B int64
C int64
Length: 3, dtype: object
改进了尝试创建列时的警告#
新用户经常被列操作和属性访问之间的关系弄糊涂 DataFrame 实例 (GH7175 )。这种困惑的一个具体例子是试图通过在 DataFrame :
In [1]: df = pd.DataFrame({'one': [1., 2., 3.]})
In [2]: df.two = [4, 5, 6]
这不会引发任何明显的例外,但也不会创建新的列:
In [3]: df
Out[3]:
one
0 1.0
1 2.0
2 3.0
现在,将类似列表的数据结构设置为新属性会引发 UserWarning 关于意外行为的可能性。看见 Attribute Access 。
方法 drop 现在还接受索引/列关键字#
The drop() method has gained index/columns keywords as an
alternative to specifying the axis. This is similar to the behavior of reindex
(GH12392).
例如:
In [7]: df = pd.DataFrame(np.arange(8).reshape(2, 4),
...: columns=['A', 'B', 'C', 'D'])
...:
In [8]: df
Out[8]:
A B C D
0 0 1 2 3
1 4 5 6 7
[2 rows x 4 columns]
In [9]: df.drop(['B', 'C'], axis=1)
Out[9]:
A D
0 0 3
1 4 7
[2 rows x 2 columns]
# the following is now equivalent
In [10]: df.drop(columns=['B', 'C'])
Out[10]:
A D
0 0 3
1 4 7
[2 rows x 2 columns]
方法: rename , reindex 现在还接受AXIS关键字#
这个 DataFrame.rename() 和 DataFrame.reindex() 方法已经获得了 axis 关键字以指定操作的目标轴 (GH12392 )。
这是 rename :
In [11]: df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
In [12]: df.rename(str.lower, axis='columns')
Out[12]:
a b
0 1 4
1 2 5
2 3 6
[3 rows x 2 columns]
In [13]: df.rename(id, axis='index')
Out[13]:
A B
139699223642320 1 4
139699223642352 2 5
139699223642384 3 6
[3 rows x 2 columns]
和 reindex :
In [14]: df.reindex(['A', 'B', 'C'], axis='columns')
Out[14]:
A B C
0 1 4 NaN
1 2 5 NaN
2 3 6 NaN
[3 rows x 3 columns]
In [15]: df.reindex([0, 1, 3], axis='index')
Out[15]:
A B
0 1.0 4.0
1 2.0 5.0
3 NaN NaN
[3 rows x 2 columns]
“索引,列”的风格一如既往地发挥作用。
In [16]: df.rename(index=id, columns=str.lower)
Out[16]:
a b
139699223642320 1 4
139699223642352 2 5
139699223642384 3 6
[3 rows x 2 columns]
In [17]: df.reindex(index=[0, 1, 3], columns=['A', 'B', 'C'])
Out[17]:
A B C
0 1.0 4.0 NaN
1 2.0 5.0 NaN
3 NaN NaN NaN
[3 rows x 3 columns]
我们 高度 鼓励使用命名参数,以避免在使用这两种样式时产生混淆。
CategoricalDtype 用于指定类别#
pandas.api.types.CategoricalDtype has been added to the public API and
expanded to include the categories and ordered attributes. A
CategoricalDtype can be used to specify the set of categories and
orderedness of an array, independent of the data. This can be useful for example,
when converting string data to a Categorical (GH14711,
GH15078, GH16015, GH17643):
In [18]: from pandas.api.types import CategoricalDtype
In [19]: s = pd.Series(['a', 'b', 'c', 'a']) # strings
In [20]: dtype = CategoricalDtype(categories=['a', 'b', 'c', 'd'], ordered=True)
In [21]: s.astype(dtype)
Out[21]:
0 a
1 b
2 c
3 a
Length: 4, dtype: category
Categories (4, object): ['a' < 'b' < 'c' < 'd']
有一个地方值得特别提及,那就是 read_csv() 。以前,使用 dtype={{'col': 'category'}} ,则返回值和类别始终为字符串。
In [22]: data = 'A,B\na,1\nb,2\nc,3'
In [23]: pd.read_csv(StringIO(data), dtype={'B': 'category'}).B.cat.categories
Out[23]: Index(['1', '2', '3'], dtype='object')
请注意“Object”数据类型。
使用一个 CategoricalDtype 在所有数字、日期时间或时间增量中,我们可以自动转换为正确的类型
In [24]: dtype = {'B': CategoricalDtype([1, 2, 3])}
In [25]: pd.read_csv(StringIO(data), dtype=dtype).B.cat.categories
Out[25]: Int64Index([1, 2, 3], dtype='int64')
这些值被正确地解释为整数。
这个 .dtype 对象的属性 Categorical , CategoricalIndex 或者是 Series 现在将返回 CategoricalDtype 。虽然REPRR已经改变了, str(CategoricalDtype()) 仍然是那根弦 'category' 。我们将借此机会提醒用户, 首选 检测分类数据的方法是使用 pandas.api.types.is_categorical_dtype() ,而不是 str(dtype) == 'category' 。
请参阅 CategoricalDtype docs 想要更多。
GroupBy 对象现在具有一个 pipe 方法#
GroupBy 对象现在具有一个 pipe 方法,类似于 DataFrame 和 Series ,这允许函数接受 GroupBy 以干净、易读的语法编写。 (GH17871 )
以获取有关组合的具体示例 .groupby 和 .pipe ,想象一下有一个DataFrame,其中包含商店、产品、收入和销售量的列。我们想做一个GroupWise计算 价格 (即收入/数量)每个商店和每个产品。我们可以在一个多步骤的操作中实现这一点,但是用管道的方式来表达它可以使代码更具可读性。
首先,我们设置数据:
In [26]: import numpy as np
In [27]: n = 1000
In [28]: df = pd.DataFrame({'Store': np.random.choice(['Store_1', 'Store_2'], n),
....: 'Product': np.random.choice(['Product_1',
....: 'Product_2',
....: 'Product_3'
....: ], n),
....: 'Revenue': (np.random.random(n) * 50 + 10).round(2),
....: 'Quantity': np.random.randint(1, 10, size=n)})
....:
In [29]: df.head(2)
Out[29]:
Store Product Revenue Quantity
0 Store_2 Product_2 32.09 7
1 Store_1 Product_3 14.20 1
[2 rows x 4 columns]
现在,要查找每个商店/产品的价格,我们只需执行以下操作:
In [30]: (df.groupby(['Store', 'Product'])
....: .pipe(lambda grp: grp.Revenue.sum() / grp.Quantity.sum())
....: .unstack().round(2))
....:
Out[30]:
Product Product_1 Product_2 Product_3
Store
Store_1 6.73 6.72 7.14
Store_2 7.59 6.98 7.23
[2 rows x 3 columns]
请参阅 documentation 想要更多。
Categorical.rename_categories 接受类似DICT的#
rename_categories() 现在接受类似于dict的参数 new_categories 。之前的类别会在词典的关键字中进行查找,如果找到就会被替换。缺少密钥和额外密钥的行为与 DataFrame.rename() 。
In [31]: c = pd.Categorical(['a', 'a', 'b'])
In [32]: c.rename_categories({"a": "eh", "b": "bee"})
Out[32]:
['eh', 'eh', 'bee']
Categories (2, object): ['eh', 'bee']
警告
为了帮助大Pandas升级, rename_categories 招待 Series 就像清单一样。通常,系列被认为是类似词典的(例如,在 .rename , .map )。在未来的Pandas版本中 rename_categories 会变得像对待字典一样对待它们。按照警告消息的建议编写面向未来的代码。
In [33]: c.rename_categories(pd.Series([0, 1], index=['a', 'c']))
FutureWarning: Treating Series 'new_categories' as a list-like and using the values.
In a future version, 'rename_categories' will treat Series like a dictionary.
For dict-like, use 'new_categories.to_dict()'
For list-like, use 'new_categories.values'.
Out[33]:
[0, 0, 1]
Categories (2, int64): [0, 1]
其他增强功能#
新函数或新方法#
新关键字#
添加了一个
skipna参数设置为infer_dtype()支持在缺少值的情况下进行类型推断 (GH17059 )。Series.to_dict()和DataFrame.to_dict()现在支持into关键字,该关键字允许您指定collections.Mapping您希望返回的子类。默认为dict它是向后兼容的。 (GH16122 )Series.set_axis()和DataFrame.set_axis()现在支持inplace参数。 (GH14636 )Series.to_pickle()和DataFrame.to_pickle()已经获得了一个protocolparameter (GH16252). By default, this parameter is set to HIGHEST_PROTOCOLread_feather()已经获得了nthreads用于多线程操作的参数 (GH16359 )DataFrame.clip()和Series.clip()已经获得了一个inplace论点。 (GH15388 )crosstab()已经获得了margins_name参数定义将在以下情况下包含总计的行/列的名称margins=True。 (GH15972 )read_json()现在接受chunksize在以下情况下可以使用的参数lines=True。如果chunksize现在,Read_json返回一个迭代器,该迭代器读入chunksize每一次迭代都有线条。 (GH17048 )read_json()和to_json()现在接受一个compression参数,该参数允许它们透明地处理压缩文件。 (GH17798 )
各种增强功能#
将大Pandas进口时间缩短约2.25倍。 (GH16764 )
支持 PEP 519 -- Adding a file system path protocol 在大多数阅读器上(例如
read_csv())和作者(例如DataFrame.to_csv()) (GH13823 )。添加了一个
__fspath__方法来执行以下操作pd.HDFStore,pd.ExcelFile,以及pd.ExcelWriter要正确使用文件系统路径协议 (GH13823 )。The
validateargument formerge()now checks whether a merge is one-to-one, one-to-many, many-to-one, or many-to-many. If a merge is found to not be an example of specified merge type, an exception of typeMergeErrorwill be raised. For more, see here (GH16270)Added support for PEP 518 (
pyproject.toml) to the build system (GH16745)RangeIndex.append()现在返回一个RangeIndex对象(如果可能) (GH16212 )Series.rename_axis()和DataFrame.rename_axis()使用inplace=True现在回来吧None同时对轴进行原地重命名。 (GH15704 )api.types.infer_dtype()现在可以推断出小数。 (GH15690 )DataFrame.select_dtypes()现在接受INCLUDE/EXCLUDE和类似列表的标量值。 (GH16855 )date_range()现在接受‘AS’之外的‘YS’作为年初的别名。 (GH9313 )date_range()现在接受‘A’之外的‘Y’作为年终的别名。 (GH9313 )DataFrame.add_prefix()和DataFrame.add_suffix()现在接受包含‘%’字符的字符串。 (GH17151 )推断压缩的读/写方法 (
read_csv(),read_table(),read_pickle(),以及to_pickle())现在可以从类似路径的对象进行推断,例如pathlib.Path。 (GH17206 )read_sas()现在可以识别SAS7BDAT文件中更多最常用的日期(日期时间)格式。 (GH15871 )DataFrame.items()和Series.items()现在在Python2和3中都存在,并且在所有情况下都是懒惰的。 (GH13918 , GH17213 )pandas.io.formats.style.Styler.where()的实现是为了方便pandas.io.formats.style.Styler.applymap()。 (GH17474 )MultiIndex.is_monotonic_decreasing()已经实施。以前退回的False在所有情况下。 (GH16554 )read_excel()加薪ImportError如果有更好的信息xlrd未安装。 (GH17613 )DataFrame.assign()将保持原来的顺序**kwargs用于Python3.6+用户,而不是对列名排序。 (GH14207 )Series.reindex(),DataFrame.reindex(),Index.get_indexer()现在支持列表形式的论点tolerance。 (GH17367 )
向后不兼容的API更改#
依赖项增加了最低版本#
我们已经更新了依赖项的最低支持版本 (GH15206 , GH15543 , GH15214 )。如果已安装,我们现在需要:
套餐
最低版本
必填项
Numpy
1.9.0
X
Matplotlib
1.4.3
Scipy
0.14.0
瓶颈
1.0.0
此外,已取消对Python3.4的支持 (GH15251 )。
全NaN或空系列/数据帧的总和/生产现在是一致的NaN#
备注
此处描述的更改已部分恢复。请参阅 v0.22.0 Whatsnew 想要更多。
的行为 sum and prod on all-NaN Series/DataFrames no longer depends on whether bottleneck 已安装,并返回值 sum 和 prod On a Empty Series已更改 (GH9422 , GH15507 )。
呼叫 sum 或 prod 在空的或全是-NaN Series ,或一列 DataFrame ,将导致 NaN 。请参阅 docs 。
In [33]: s = pd.Series([np.nan])
以前没有 bottleneck 已安装:
In [2]: s.sum()
Out[2]: np.nan
以前使用 bottleneck :
In [2]: s.sum()
Out[2]: 0.0
新行为,不考虑瓶颈安装:
In [34]: s.sum()
Out[34]: 0.0
请注意,这还会更改空的 Series 。以前,它总是返回0,而不管 bottleneck 安装:
In [1]: pd.Series([]).sum()
Out[1]: 0
但为了与全NaN的情况保持一致,也将其更改为返回NaN:
In [35]: pd.Series([]).sum()
Out[35]: 0.0
不建议使用缺少标注的列表进行索引#
Previously, selecting with a list of labels, where one or more labels were missing would always succeed, returning NaN for missing labels.
This will now show a FutureWarning. In the future this will raise a KeyError (GH15747).
This warning will trigger on a DataFrame or a Series for using .loc[] or [[]] when passing a list-of-labels with at least 1 missing label.
See the deprecation docs.
In [36]: s = pd.Series([1, 2, 3])
In [37]: s
Out[37]:
0 1
1 2
2 3
Length: 3, dtype: int64
以前的行为
In [4]: s.loc[[1, 2, 3]]
Out[4]:
1 2.0
2 3.0
3 NaN
dtype: float64
当前行为
In [4]: s.loc[[1, 2, 3]]
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.
See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike
Out[4]:
1 2.0
2 3.0
3 NaN
dtype: float64
实现选择可能找不到的元素的惯用方法是通过 .reindex()
In [38]: s.reindex([1, 2, 3])
Out[38]:
1 2.0
2 3.0
3 NaN
Length: 3, dtype: float64
找到所有关键字后的选择不变。
In [39]: s.loc[[1, 2]]
Out[39]:
1 2
2 3
Length: 2, dtype: int64
NA命名更改#
为了促进PandasAPI之间的更多一致性,我们添加了额外的顶级函数 isna() 和 notna() 是的别名 isnull() 和 notnull() 。命名方案现在与以下方法更一致 .dropna() 和 .fillna() 。此外,在所有情况下 .isnull() 和 .notnull() 方法是定义的,这些方法具有名为 .isna() 和 .notna() ,这些都包括在课程中 Categorical , Index , Series ,以及 DataFrame 。 (GH15001 )。
配置选项 pd.options.mode.use_inf_as_null 已弃用,并且 pd.options.mode.use_inf_as_na 被添加为替代。
系列/索引的迭代现在将返回Python标量#
以前,当使用某些迭代方法处理 Series 使用数据类型 int 或 float ,您将收到一个 numpy 标量,例如a np.int64 ,而不是一条 Python int 。发行 (GH10904 )更正了这一点 Series.tolist() 和 list(Series) 。此更改使所有迭代方法保持一致,尤其是对于 __iter__() 和 .map() ;请注意,这只影响整型/浮点型数据类型。 (GH13236 , GH13258 , GH14216 )。
In [40]: s = pd.Series([1, 2, 3])
In [41]: s
Out[41]:
0 1
1 2
2 3
Length: 3, dtype: int64
之前:
In [2]: type(list(s)[0])
Out[2]: numpy.int64
新行为:
In [42]: type(list(s)[0])
Out[42]: int
此外,这现在将正确地装箱迭代的结果 DataFrame.to_dict() 也是。
In [43]: d = {'a': [1], 'b': ['b']}
In [44]: df = pd.DataFrame(d)
之前:
In [8]: type(df.to_dict()['a'][0])
Out[8]: numpy.int64
新行为:
In [45]: type(df.to_dict()['a'][0])
Out[45]: int
使用布尔索引进行索引#
以前在传递布尔值时 Index 至 .loc ,如果 Series/DataFrame 有 boolean 标签,您将获得基于标签的选择,这可能会复制结果标签,而不是布尔索引选择(其中 True 选择元素),这与布尔数组的索引方式不一致。新的行为类似于布尔型数字数组索引器。 (GH17738 )
以前的行为:
In [46]: s = pd.Series([1, 2, 3], index=[False, True, False])
In [47]: s
Out[47]:
False 1
True 2
False 3
Length: 3, dtype: int64
In [59]: s.loc[pd.Index([True, False, True])]
Out[59]:
True 2
False 1
False 3
True 2
dtype: int64
当前行为
In [48]: s.loc[pd.Index([True, False, True])]
Out[48]:
False 1
False 3
Length: 2, dtype: int64
此外,以前如果您有一个非数字的索引(例如字符串),那么布尔索引将引发 KeyError 。现在,它将被视为布尔索引器。
以前的行为:
In [49]: s = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
In [50]: s
Out[50]:
a 1
b 2
c 3
Length: 3, dtype: int64
In [39]: s.loc[pd.Index([True, False, True])]
KeyError: "None of [Index([True, False, True], dtype='object')] are in the [index]"
当前行为
In [51]: s.loc[pd.Index([True, False, True])]
Out[51]:
a 1
c 3
Length: 2, dtype: int64
PeriodIndex 重采样#
In previous versions of pandas, resampling a Series/DataFrame indexed by a PeriodIndex returned a DatetimeIndex in some cases (GH12884). Resampling to a multiplied frequency now returns a PeriodIndex (GH15944). As a minor enhancement, resampling a PeriodIndex can now handle NaT values (GH13224)
以前的行为:
In [1]: pi = pd.period_range('2017-01', periods=12, freq='M')
In [2]: s = pd.Series(np.arange(12), index=pi)
In [3]: resampled = s.resample('2Q').mean()
In [4]: resampled
Out[4]:
2017-03-31 1.0
2017-09-30 5.5
2018-03-31 10.0
Freq: 2Q-DEC, dtype: float64
In [5]: resampled.index
Out[5]: DatetimeIndex(['2017-03-31', '2017-09-30', '2018-03-31'], dtype='datetime64[ns]', freq='2Q-DEC')
新行为:
In [52]: pi = pd.period_range('2017-01', periods=12, freq='M')
In [53]: s = pd.Series(np.arange(12), index=pi)
In [54]: resampled = s.resample('2Q').mean()
In [55]: resampled
Out[55]:
2017Q1 2.5
2017Q3 8.5
Freq: 2Q-DEC, Length: 2, dtype: float64
In [56]: resampled.index
Out[56]: PeriodIndex(['2017Q1', '2017Q3'], dtype='period[2Q-DEC]')
Upsampling and calling .ohlc() previously returned a Series, basically identical to calling .asfreq(). OHLC upsampling now returns a DataFrame with columns open, high, low and close (GH13083). This is consistent with downsampling and DatetimeIndex behavior.
以前的行为:
In [1]: pi = pd.period_range(start='2000-01-01', freq='D', periods=10)
In [2]: s = pd.Series(np.arange(10), index=pi)
In [3]: s.resample('H').ohlc()
Out[3]:
2000-01-01 00:00 0.0
...
2000-01-10 23:00 NaN
Freq: H, Length: 240, dtype: float64
In [4]: s.resample('M').ohlc()
Out[4]:
open high low close
2000-01 0 9 0 9
新行为:
In [57]: pi = pd.period_range(start='2000-01-01', freq='D', periods=10)
In [58]: s = pd.Series(np.arange(10), index=pi)
In [59]: s.resample('H').ohlc()
Out[59]:
open high low close
2000-01-01 00:00 0.0 0.0 0.0 0.0
2000-01-01 01:00 NaN NaN NaN NaN
2000-01-01 02:00 NaN NaN NaN NaN
2000-01-01 03:00 NaN NaN NaN NaN
2000-01-01 04:00 NaN NaN NaN NaN
... ... ... ... ...
2000-01-10 19:00 NaN NaN NaN NaN
2000-01-10 20:00 NaN NaN NaN NaN
2000-01-10 21:00 NaN NaN NaN NaN
2000-01-10 22:00 NaN NaN NaN NaN
2000-01-10 23:00 NaN NaN NaN NaN
[240 rows x 4 columns]
In [60]: s.resample('M').ohlc()
Out[60]:
open high low close
2000-01 0 9 0 9
[1 rows x 4 columns]
改进了pd.eval中项目分配过程中的错误处理#
eval() 现在将引发一个 ValueError 当指定了项目分配故障或就地操作,但表达式中没有项目分配时 (GH16732 )
In [61]: arr = np.array([1, 2, 3])
以前,如果您尝试以下表达式,则会得到一条帮助不大的错误消息:
In [3]: pd.eval("a = 1 + 2", target=arr, inplace=True)
...
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`)
and integer or boolean arrays are valid indices
这是一种很长的说法,说明NumPy数组不支持字符串项索引。进行此更改后,错误消息现在如下所示:
In [3]: pd.eval("a = 1 + 2", target=arr, inplace=True)
...
ValueError: Cannot assign expression output to target
过去,即使没有项目分配,也可以就地计算表达式:
In [4]: pd.eval("1 + 2", target=arr, inplace=True)
Out[4]: 3
但是,该输入没有多大意义,因为输出没有分配给目标。现在,一个 ValueError 在传入此类输入时将引发:
In [4]: pd.eval("1 + 2", target=arr, inplace=True)
...
ValueError: Cannot operate inplace if there is no assignment
数据类型转换#
以前的任务, .where() 和 .fillna() 使用一个 bool 赋值时,将强制使用相同的类型(例如int/Float),或对类似日期的类型进行提升。现在,这些将通过以下方式保存BOOL object 数据类型。 (GH16821 )。
In [62]: s = pd.Series([1, 2, 3])
In [5]: s[1] = True
In [6]: s
Out[6]:
0 1
1 1
2 3
dtype: int64
新行为
In [63]: s[1] = True
In [64]: s
Out[64]:
0 1
1 True
2 3
Length: 3, dtype: object
以前,将AS赋值给具有非DateTime的类DateTime会强制分配非DateTime的项 (GH14145 )。
In [65]: s = pd.Series([pd.Timestamp('2011-01-01'), pd.Timestamp('2012-01-01')])
In [1]: s[1] = 1
In [2]: s
Out[2]:
0 2011-01-01 00:00:00.000000000
1 1970-01-01 00:00:00.000000001
dtype: datetime64[ns]
这些现在迫使他们 object 数据类型。
In [66]: s[1] = 1
In [67]: s
Out[67]:
0 2011-01-01 00:00:00
1 1
Length: 2, dtype: object
具有单层的多索引构造函数#
这个 MultiIndex 构造函数不再压缩所有长度的多重索引--1级向下压缩为常规的 Index 。这会影响到所有 MultiIndex 构造函数。 (GH17178 )
以前的行为:
In [2]: pd.MultiIndex.from_tuples([('a',), ('b',)])
Out[2]: Index(['a', 'b'], dtype='object')
长度为1的级别不再是特殊大小写。它们的行为完全像你有长度为2+的级别,所以一个 MultiIndex 始终从所有 MultiIndex 构造函数:
In [68]: pd.MultiIndex.from_tuples([('a',), ('b',)])
Out[68]:
MultiIndex([('a',),
('b',)],
)
UTC系列本地化#
在此之前, to_datetime() 未本地化日期时间 Series 数据何时 utc=True 通过了。现在, to_datetime() 将正确本地化 Series 使用一个 datetime64[ns, UTC] 数据类型与List-Like和 Index 数据被处理。 (GH6415 )。
以前的行为
In [69]: s = pd.Series(['20130101 00:00:00'] * 3)
In [12]: pd.to_datetime(s, utc=True)
Out[12]:
0 2013-01-01
1 2013-01-01
2 2013-01-01
dtype: datetime64[ns]
新行为
In [70]: pd.to_datetime(s, utc=True)
Out[70]:
0 2013-01-01 00:00:00+00:00
1 2013-01-01 00:00:00+00:00
2 2013-01-01 00:00:00+00:00
Length: 3, dtype: datetime64[ns, UTC]
此外,具有DateTime列的DataFrame由 read_sql_table() 和 read_sql_query() 仅当原始SQL列是支持时区的DATETIME列时,才会将其本地化为UTC。
值域函数的一致性#
在以前的版本中,各种范围函数之间存在一些不一致: date_range() , bdate_range() , period_range() , timedelta_range() ,以及 interval_range() 。 (GH17471 )。
时发生的不一致行为之一 start , end 和 period 所有参数都已指定,可能会导致范围不明确。当所有三个参数都被传递时, interval_range 忽略了 period 参数, period_range 忽略了 end 参数,并引发其他范围函数。为了促进范围函数之间的一致性,并避免潜在的模糊范围, interval_range 和 period_range 现在将在传递所有三个参数时引发。
以前的行为:
In [2]: pd.interval_range(start=0, end=4, periods=6)
Out[2]:
IntervalIndex([(0, 1], (1, 2], (2, 3]]
closed='right',
dtype='interval[int64]')
In [3]: pd.period_range(start='2017Q1', end='2017Q4', periods=6, freq='Q')
Out[3]: PeriodIndex(['2017Q1', '2017Q2', '2017Q3', '2017Q4', '2018Q1', '2018Q2'], dtype='period[Q-DEC]', freq='Q-DEC')
新行为:
In [2]: pd.interval_range(start=0, end=4, periods=6)
---------------------------------------------------------------------------
ValueError: Of the three parameters: start, end, and periods, exactly two must be specified
In [3]: pd.period_range(start='2017Q1', end='2017Q4', periods=6, freq='Q')
---------------------------------------------------------------------------
ValueError: Of the three parameters: start, end, and periods, exactly two must be specified
此外,端点参数 end 不包括在由 interval_range 。但是,所有其他范围函数包括 end 在他们的产出中。为了促进范围函数之间的一致性, interval_range 现在将包括 end 作为最终间隔的右端点,除非 freq 是以一种跳过 end 。
以前的行为:
In [4]: pd.interval_range(start=0, end=4)
Out[4]:
IntervalIndex([(0, 1], (1, 2], (2, 3]]
closed='right',
dtype='interval[int64]')
新行为:
In [71]: pd.interval_range(start=0, end=4)
Out[71]: IntervalIndex([[0, 1], [1, 2], [2, 3], [3, 4]], dtype='interval[int64, both]')
无自动Matplotlib转换器#
Pandas不再登记我们的 date , time , datetime , datetime64 ,以及 Period 进口Pandas时使用matplotlib的转换器。Matplotlib作图方法 (plt.plot , ax.plot ,...),将不会很好地格式化x轴 DatetimeIndex 或 PeriodIndex 价值观。您必须显式注册以下方法:
pandas built-in Series.plot and DataFrame.plot will register these
converters on first-use (GH17710).
备注
这一变化在Pandas0.21.1中暂时恢复,更多细节请参见 here 。
其他API更改#
类别构造函数不再接受
categories关键字。 (GH16022 )Accessing a non-existent attribute on a closed
HDFStorewill now raise anAttributeErrorrather than aClosedFileError(GH16301)read_csv()现在发布一个UserWarning如果names参数包含重复项 (GH17095 )read_csv()现在招待'null'和'n/a'缺省情况下将字符串作为缺失值 (GH16471 , GH16078 )pandas.HDFStore的字符串表示现在更快,更不详细。pandas.HDFStore.info()。 (GH16503 )。HDF商店中的压缩默认设置现在遵循PYTABLE标准。默认设置为无压缩,并且如果
complib失踪了,而且complevel>0zlibvt.使用 (GH15943 )Index.get_indexer_non_unique()now returns a ndarray indexer rather than anIndex; this is consistent withIndex.get_indexer()(GH16819)删除了
@slow装饰师来自pandas._testing,这给一些下游包的测试套件带来了问题。使用@pytest.mark.slow取而代之的是,它实现了同样的事情 (GH16850 )移动的定义
MergeError发送到pandas.errors模块。The signature of
Series.set_axis()andDataFrame.set_axis()has been changed fromset_axis(axis, labels)toset_axis(labels, axis=0), for consistency with the rest of the API. The old signature is deprecated and will show aFutureWarning(GH14636)Series.argmin()andSeries.argmax()will now raise aTypeErrorwhen used withobjectdtypes, instead of aValueError(GH13595)Period现在是不可变的,并且现在将引发AttributeError当用户尝试将新值分配给ordinal或freq属性 (GH17116 )。to_datetime()when passed a tz-awareorigin=kwarg will now raise a more informativeValueErrorrather than aTypeError(GH16842)to_datetime()现在引发一个ValueError当格式包括%W或%U不包括星期几和日历年 (GH16774 )已重命名为非功能性
index至index_col在……里面read_stata()提高API一致性 (GH16342 )窃听
DataFrame.drop()导致的布尔标签False和True从数值索引中删除索引时分别被视为标签0和1。这现在将引发ValueError (GH16877 )受限制的DateOffset关键字参数。以前,
DateOffset子类允许任意关键字参数,这可能导致意外行为。现在,只有有效的论点才会被接受。 (GH17176 )。
不推荐使用#
DataFrame.from_csv()andSeries.from_csv()have been deprecated in favor ofread_csv()(GH4191)read_excel()has deprecatedsheetnamein favor ofsheet_namefor consistency with.to_excel()(GH10559).read_excel()has deprecatedparse_colsin favor ofusecolsfor consistency withread_csv()(GH4988)read_csv()has deprecated thetupleize_colsargument. Column tuples will always be converted to aMultiIndex(GH17060)DataFrame.to_csv()已不推荐使用tupleize_cols争论。多索引列将始终以行的形式写入CSV文件 (GH17060 )这个
convert参数已被弃用。.take()方法,因为它不被尊重 (GH16948 )pd.options.html.borderhas been deprecated in favor ofpd.options.display.html.border(GH15793).SeriesGroupBy.nth()has deprecatedTruein favor of'all'for its kwargdropna(GH11038).DataFrame.as_blocks()已弃用,因为这会公开内部实现 (GH17302 )pd.TimeGrouperis deprecated in favor ofpandas.Grouper(GH16747)cdate_range已被弃用,取而代之的是bdate_range(),它已经获得了weekmask和holidays用于构建自定义频率日期范围的参数。请参阅 documentation 获取更多详细信息 (GH17596 )passing
categoriesororderedkwargs toSeries.astype()is deprecated, in favor of passing a CategoricalDtype (GH17636).get_value和.set_value在……上面Series,DataFrame,Panel,SparseSeries,以及SparseDataFrame不推荐使用,而是使用.iat[]或.at[]访问者 (GH15269 )传入一个不存在的列
.to_excel(..., columns=)已弃用,并将引发KeyError在未来 (GH17295 )raise_on_errorparameter toSeries.where(),Series.mask(),DataFrame.where(),DataFrame.mask()is deprecated, in favor oferrors=(GH14968)使用
DataFrame.rename_axis()和Series.rename_axis()更改索引或列 标签 现在已弃用,转而支持使用.rename。rename_axis仍可用于更改索引或列的名称 (GH17833 )。reindex_axis()已被弃用,取而代之的是reindex()。看见 here 了解更多信息 (GH17833 )。
Series.select和DataFrame.select#
The Series.select() and DataFrame.select() methods are deprecated in favor of using df.loc[labels.map(crit)] (GH12401)
In [72]: df = pd.DataFrame({'A': [1, 2, 3]}, index=['foo', 'bar', 'baz'])
In [3]: df.select(lambda x: x in ['bar', 'baz'])
FutureWarning: select is deprecated and will be removed in a future release. You can use .loc[crit] as a replacement
Out[3]:
A
bar 2
baz 3
In [73]: df.loc[df.index.map(lambda x: x in ['bar', 'baz'])]
Out[73]:
A
bar 2
baz 3
[2 rows x 1 columns]
Series.argmax和Series.argmin#
的行为 Series.argmax() 和 Series.argmin() 已被弃用,取而代之的是 Series.idxmax() 和 Series.idxmin() ,分别 (GH16830 )。
为了与NumPy阵列兼容, pd.Series 机具 argmax 和 argmin 。从Pandas0.13.0开始, argmax 一直是一个别名 pandas.Series.idxmax() ,以及 argmin 一直是一个别名 pandas.Series.idxmin() 。它们返回 标签 的最大值或最小值,而不是 职位 。
我们已经不赞成当前的行为 Series.argmax 和 Series.argmin 。使用这两种方法之一都会发出一个 FutureWarning 。使用 Series.idxmax() 如果你想要最大值的标签。使用 Series.values.argmax() 如果你想要最大值的位置。最低限度也是如此。在未来的版本中 Series.argmax 和 Series.argmin 将返回最大值或最小值的位置。
删除先前版本的弃用/更改#
read_excel()已经放弃了has_index_names参数 (GH10967 )这个
pd.options.display.height配置已丢弃 (GH3663 )这个
pd.options.display.line_width配置已丢弃 (GH2881 )这个
pd.options.display.mpl_style配置已丢弃 (GH12190 )Indexhas dropped the.sym_diff()method in favor of.symmetric_difference()(GH12591)Categoricalhas dropped the.order()and.sort()methods in favor of.sort_values()(GH12882)eval()andDataFrame.eval()have changed the default ofinplacefromNonetoFalse(GH11149)该函数
get_offset_name已经放弃,取而代之的是.freqstr偏移量的属性 (GH11834 )Pandas不再测试与hdf5的兼容性-使用Pandas<0.11创建的文件 (GH17404 )。
性能改进#
Improved performance of instantiating
SparseDataFrame(GH16773)改进的性能
set_categories()通过不实现价值 (GH17508 )Timestamp.microsecond不再对属性访问进行重新计算 (GH17331 )提高了
CategoricalIndex对于已经是绝对数据类型的数据 (GH17513 )改进的性能
RangeIndex.min()和RangeIndex.max()通过使用RangeIndex属性来执行计算。 (GH17607 )
文档更改#
错误修复#
转换#
对类似DateTime的数据进行赋值时出现错误,
int可能会错误地转换为类似DateTime (GH14145 )分配中的错误
int64具有以下功能的数据np.ndarray使用float64DTYPE可以保留int64数据类型 (GH14001 )修复了的返回类型
IntervalIndex.is_non_overlapping_monotonic成为一条 Pythonbool用于与类似属性/方法的一致性。以前返回了一个numpy.bool_。 (GH17237 )窃听
IntervalIndex.is_non_overlapping_monotonic当间隔在两侧闭合并在一点重叠时 (GH16560 )窃听
Series.fillna()在以下情况下返回Frameinplace=True和value是DICT (GH16156 )窃听
Timestamp.weekday_name在本地化为时区时返回基于UTC的工作日名称 (GH17354 )窃听
Timestamp.replace当更换时tzinfo围绕DST的变化 (GH15683 )窃听
Timedelta构造和算法,它们不会传播Overflow例外情况 (GH17367 )窃听
astype()传递扩展类型类时转换为对象数据类型 (DatetimeTZDtype,CategoricalDtype)而不是实例。现在是一个TypeError在传递类时引发 (GH17780 )。Bug in
to_numeric()in which elements were not always being coerced to numeric whenerrors='coerce'(GH17007, GH17125)Bug in
DataFrameandSeriesconstructors whererangeobjects are converted toint32dtype on Windows instead ofint64(GH16804)
标引#
当使用空片调用时(例如
df.iloc[:])、.iloc和.loc索引器返回原始对象的浅表副本。以前,它们返回原始对象。 (GH13873 )。在未排序的
MultiIndex,即loc索引器现在将引发UnsortedIndexError仅当在未排序的级别上使用适当的切片时 (GH16734 )。Fixes regression in 0.20.3 when indexing with a string on a
TimedeltaIndex(GH16896).固定的
TimedeltaIndex.get_loc()处理np.timedelta64输入 (GH16909 )。修复
MultiIndex.sort_index()订购时间ascending参数是一个列表,但不是指定了所有级别,或者不是以不同的顺序指定 (GH16934 )。修复了使用进行索引的错误
np.inf导致了一个OverflowError待养 (GH16957 )Bug in reindexing on an empty
CategoricalIndex(GH16770)Fixes
DataFrame.locfor setting with alignment and tz-awareDatetimeIndex(GH16889)避免
IndexError将索引或级数传递给.iloc带着老麻木 (GH17193 )允许在Python2的多级列中使用Unicode空字符串作为占位符 (GH17099 )
窃听
.iloc与就地加法或赋值一起使用时,以及MultiIndex导致读取和写入错误的索引 (GH17148 )窃听
.isin()其中将成员资格检查为空Series对象引发错误 (GH16991 )窃听
CategoricalIndex不遵守包含重复项的指定索引的重建索引 (GH17323 )的交叉点出现错误
RangeIndex带负阶跃 (GH17296 )窃听
IntervalIndex其中,对包含的非重叠单调递减索引的右端点执行标量查找失败 (GH16417 , GH17271 )窃听
DataFrame.first_valid_index()和DataFrame.last_valid_index()当没有有效条目时 (GH17400 )窃听
Series.rename()方法调用时,会错误地更改Series,而不是Index。 (GH17407 )窃听
String.str_get()加薪IndexError而不是在使用负索引时插入NAN。 (GH17704 )
IO#
窃听
read_hdf()从读取时区感知索引时fixed格式化HDFStore (GH17618 )窃听
read_csv()其中的列未彻底消除重复数据 (GH17060 )窃听
read_csv()其中指定的列名没有被彻底消除重复 (GH17095 )窃听
read_csv()其中,Header参数的非整数值生成了一条无用/无关的错误消息 (GH16338 )窃听
read_csv()其中异常处理中的内存管理问题在某些情况下会导致解释器段错误 (GH14696 , GH16798 )。Bug in
read_csv()when called withlow_memory=Falsein which a CSV with at least one column > 2GB in size would incorrectly raise aMemoryError(GH16798).窃听
read_csv()使用单元素列表调用时header将返回一个DataFrame在所有NaN值中 (GH7757 )窃听
DataFrame.to_csv()默认使用‘ascii’编码,而不是‘utf-8’。 (GH17097 )窃听
read_stata()其中,使用迭代器时无法读取值标签 (GH16923 )窃听
read_stata()未设置索引的位置 (GH16342 )窃听
read_html()当在多个线程中运行时,导入检查失败 (GH16928 )窃听
read_csv()其中,自动分隔符检测导致TypeError遇到错误行时抛出,而不是正确的错误消息 (GH13374 )窃听
DataFrame.to_html()使用notebook=True其中,具有命名索引或非多索引索引的DataFrame对于列或行标签分别具有不需要的水平对齐或垂直对齐 (GH16792 )窃听
DataFrame.to_html()其中没有验证justify参数 (GH17527 )窃听
HDFStore.select()当读取具有VLArray的连续混合数据表时 (GH17021 )窃听
to_json()其中有几种情况(包括具有不可打印符号的对象、具有深度递归的对象、过长的标签)导致分段错误,而不是引发相应的异常 (GH14256 )
标绘#
使用绘图方法时出现错误
secondary_y和fontsize未设置副轴字体大小 (GH12565 )打印时出现错误
timedelta和datetimeY轴上的数据类型 (GH16953 )线状图在计算xlims时不再假定单调的x数据,现在即使是未排序的x数据,它们也会显示整条线。 (GH11310 , GH11471 )
在matplotlib 2.0.0和更高版本中,线条图的x限制的计算留给matplotlib,以便应用其新的默认设置。 (GH15495 )
Bug in
Series.plot.barorDataFrame.plot.barwithynot respecting user-passedcolor(GH16822)错误导致
plotting.parallel_coordinates使用随机颜色时重置随机种子 (GH17525 )
分组依据/重采样/滚动#
Bug in
DataFrame.resample(...).size()where an emptyDataFramedid not return aSeries(GH14962)窃听
infer_freq()导致工作日有两天间隔的指数被错误地推断为商业日报 (GH16624 )Bug in
.rolling(...).quantile()which incorrectly used different defaults thanSeries.quantile()andDataFrame.quantile()(GH9413, GH16211)窃听
groupby.transform()这将强制布尔数据类型返回浮点型 (GH16875 )Bug in
Series.resample(...).apply()where an emptySeriesmodified the source index and did not return the name of aSeries(GH14313)Bug in
.rolling(...).apply(...)with aDataFramewith aDatetimeIndex, awindowof a timedelta-convertible andmin_periods >= 1(GH15305)窃听
DataFrame.groupby当键的数量等于GROUPBY轴上的元素数量时,无法正确识别索引键和列键 (GH16859 )窃听
groupby.nunique()使用TimeGrouper它不能处理NaT正确无误 (GH17575 )窃听
DataFrame.groupby其中,单个级别选择来自MultiIndex出乎意料地排序 (GH17537 )窃听
DataFrame.groupby在以下情况下发出虚假警告Grouper对象用于重写不明确的列名。 (GH17383 )窃听
TimeGrouper作为列表和标量传递时不同 (GH17530 )
稀疏#
窃听
SparseSeries加薪AttributeError当词典作为数据传入时 (GH16905 )窃听
SparseDataFrame.fillna()当从SciPy稀疏矩阵实例化帧时,未填充所有NAN (GH16112 )Bug in
SparseSeries.unstack()andSparseDataFrame.stack()(GH16614, GH15045)Bug in
make_sparse()treating two numeric/boolean data, which have same bits, as same when arraydtypeisobject(GH17574)SparseArray.all()和SparseArray.any()现已实现为处理SparseArray,这些已被使用,但未实现 (GH17570 )
重塑#
Joining/Merging with a non unique
PeriodIndexraised aTypeError(GH16871)窃听
crosstab()其中,非对齐的整数序列被强制转换为浮点型 (GH17005 )Bug in merging with categorical dtypes with datetimelikes incorrectly raised a
TypeError(GH16900)使用时出现错误
isin()关于大对象序列和大比较数组 (GH16012 )修正了从0.2开始的回归,
Series.aggregate()和DataFrame.aggregate()再次允许将词典作为返回值 (GH16741 )Fixes dtype of result with integer dtype input, from
pivot_table()when called withmargins=True(GH17013)Bug in
crosstab()where passing twoSerieswith the same name raised aKeyError(GH13279)Series.argmin(),Series.argmax(),和他们的同行在DataFrameGroupby对象可以正确处理包含无限值的浮点数据 (GH13595 )。Bug in
unique()where checking a tuple of strings raised aTypeError(GH17108)修复了按多列排序时的回归问题
datetime64数据类型Series使用NaT值 (GH16836 )Bug in
pivot_table()where the result's columns did not preserve the categorical dtype ofcolumnswhendropnawasFalse(GH17842)Bug in
DataFrame.drop_duplicateswhere dropping with non-unique column names raised aValueError(GH17836)窃听
unstack()当对级别列表调用时,它将丢弃fillna论据 (GH13971 )对齐中的错误
range对象和其他列表点赞DataFrame导致按行而不是按列执行操作 (GH17901 )
数字#
Bug in
.clip()withaxis=1and a list-like forthresholdis passed; previously this raisedValueError(GH15390)Series.clip()andDataFrame.clip()now treat NA values for upper and lower arguments asNoneinstead of raisingValueError(GH17276).
直截了当的#
窃听
Series.isin()当使用一个绝对的 (GH16639 )具有空值和类别的分类构造函数中的错误,导致
.categories做一个空虚的人Float64Index而不是空荡荡的Index具有对象数据类型 (GH17248 )分类运算中的错误,使用 Series.cat 不保留原版剧集的名称 (GH17509 )
窃听
DataFrame.merge()对于数据类型为Boolean/int的类别列失败 (GH17187 )在构造一个
Categorical/CategoricalDtype当指定的categories是绝对型的 (GH17884 )。
PyPy#
Compatibility with PyPy in
read_csv()withusecols=[<unsorted ints>]andread_json()(GH17351)Split tests into cases for CPython and PyPy where needed, which highlights the fragility of index matching with
float('nan'),np.nanandNAT(GH17351)修复
DataFrame.memory_usage()来支持PYPy。PyPy上的对象没有固定大小,因此使用近似值 (GH17228 )
其他#
贡献者#
共有206人为此次发布贡献了补丁。名字中带有“+”的人第一次贡献了一个补丁。
3553x +
Aaron Barber
Adam Gleave +
Adam Smith +
AdamShamlian +
Adrian Liaw +
Alan Velasco +
Alan Yee +
Alex B +
Alex Lubbock +
Alex Marchenko +
Alex Rychyk +
Amol K +
Andreas Winkler
Andrew +
Andrew 亮
André Jonasson +
Becky Sweger
Berkay +
Bob Haffner +
Bran Yang
Brian Tu +
Brock Mendel +
Carol Willing +
Carter Green +
Chankey Pathak +
Chris
Chris Billington
Chris Filo Gorgolewski +
Chris Kerr
Chris M +
Chris Mazzullo +
Christian Prinoth
Christian Stade-Schuldt
Christoph Moehl +
DSM
Daniel Chen +
Daniel Grady
Daniel Himmelstein
Dave Willmer
David Cook
David Gwynne
David Read +
Dillon Niederhut +
Douglas Rudd
Eric Stein +
Eric Wieser +
Erik Fredriksen
Florian Wilhelm +
Floris Kint +
Forbidden Donut
Gabe F +
Giftlin +
Giftlin Rajaiah +
Giulio Pepe +
Guilherme Beltramini
Guillem Borrell +
Hanmin Qin +
Hendrik Makait +
Hugues Valois
Hussain Tamboli +
Iva Miholic +
Jan Novotný +
Jan Rudolph
Jean Helie +
Jean-Baptiste Schiratti +
Jean-Mathieu Deschenes
Jeff Knupp +
Jeff Reback
Jeff Tratner
JennaVergeynst
JimStearns206
Joel Nothman
John W. O'Brien
Jon Crall +
Jon Mease
Jonathan J. Helmus +
Joris Van den Bossche
JosephWagner
Juarez Bochi
Julian Kuhlmann +
Karel De Brabandere
Kassandra Keeton +
Keiron Pizzey +
Keith Webber
Kernc
Kevin Sheppard
Kirk Hansen +
Licht Takeuchi +
Lucas Kushner +
Mahdi Ben Jelloul +
Makarov Andrey +
Malgorzata Turzanska +
Marc Garcia +
Margaret Sy +
MarsGuy +
Matt Bark +
Matthew Roeschke
Matti Picus
Mehmet Ali "Mali" Akmanalp
Michael Gasvoda +
Michael Penkov +
Milo +
Morgan Stuart +
Morgan243 +
Nathan Ford +
Nick Eubank
Nick Garvey +
Oleg Shteynbuk +
P-Tillmann +
Pankaj Pandey
Patrick Luo
Patrick O'Melveny
Paul Reidy +
Paula +
Peter Quackenbush
Peter Yanovich +
Phillip Cloud
Pierre Haessig
Pietro Battiston
Pradyumna Reddy Chinthala
Prasanjit Prakash
RobinFiveWords
Ryan Hendrickson
Sam Foo
Sangwoong Yoon +
Simon Gibbons +
SimonBaron
Steven Cutting +
Sudeep +
Sylvia +
T N +
Telt
Thomas A Caswell
Tim Swast +
Tom Augspurger
Tong SHEN
Tuan +
Utkarsh Upadhyay +
Vincent La +
Vivek +
WANG Aiyong
WBare
Wes McKinney
XF +
Yi Liu +
Yosuke Nakabayashi +
aaron315 +
abarber4gh +
aernlund +
agustín méndez +
andymaheshw +
ante328 +
aviolov +
bpraggastis
cbertinato +
cclauss +
chernrick
chris-b1
dkamm +
dwkenefick
economy
faic +
fding253 +
gfyoung
guygoldberg +
hhuuggoo +
huashuai +
ian
iulia +
jaredsnyder
jbrockmendel +
jdeschenes
jebob +
jschendel +
keitakurita
kernc +
kiwirob +
kjford
linebp
lloydkirk
louispotok +
majiang +
manikbhandari +
matthiashuschle +
mattip
maxwasserman +
mjlove12 +
nmartensen +
pandas-docs-bot +
parchd-1 +
philipphanemann +
rdk1024 +
reidy-p +
ri938
ruiann +
rvernica +
s-weigand +
scotthavard92 +
skwbc +
step4me +
tobycheese +
topper-123 +
tsdlovell
ysau +
zzgao +