版本 0.21.0 (2017 年 10 月 27 日)#
這是從 0.20.3 版本開始的一個主要版本釋出,其中包含大量 API 更改、棄用、新功能、增強功能和效能改進,以及大量的錯誤修復。我們建議所有使用者升級到此版本。
亮點包括
與 Apache Parquet 整合,包括一個新的頂級函式
read_parquet()和方法DataFrame.to_parquet(),參見 此處。面向使用者的新
pandas.api.types.CategoricalDtype,用於獨立於資料指定分類,參見 此處。現在
sum和prod在全 NaN 的 Series/DataFrame 上的行為是一致的,不再依賴於是否安裝了 bottleneck,並且空 Series 上的sum和prod現在返回 NaN 而不是 0,參見 此處。與 pypy 的相容性修復,參見 此處。
對
drop、reindex和renameAPI 的新增,使其更加一致,參見 此處。使用標籤列表進行索引,如果其中一個或多個標籤缺失,將被棄用,並在未來版本中引發 KeyError,參見 此處。
新功能#
與 Apache Parquet 檔案格式整合#
與 Apache Parquet 整合,包括一個全新的頂級函式 read_parquet() 和方法 DataFrame.to_parquet(),參見 此處(GH 15838,GH 17438)。
Apache Parquet 提供了一種跨語言的二進位制檔案格式,用於高效地讀取和寫入資料框。Parquet 旨在忠實地序列化和反序列化 DataFrame,支援所有 pandas 的 dtype,包括擴充套件 dtype,如帶時區的 datetime。
此功能取決於 pyarrow 或 fastparquet 庫。有關更多詳細資訊,請參閱 關於 Parquet 的 IO 文件。
方法 infer_objects 型別轉換#
添加了 DataFrame.infer_objects() 和 Series.infer_objects() 方法,用於對 object 列執行 dtype 推斷,取代了已棄用的 convert_objects 方法的部分功能。有關更多詳細資訊,請參見 此處 的文件。(GH 11221)
此方法僅對 object 列執行軟轉換,將 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 str
dtype: object
In [3]: df.infer_objects().dtypes
Out[3]:
A int64
B int64
C str
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
dtype: object
嘗試建立列時改進的警告#
新使用者常常對列操作和 DataFrame 例項上的屬性訪問之間的關係感到困惑(GH 7175)。其中一個具體的例子是嘗試透過設定 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。參見 屬性訪問。
方法 drop 現在也接受 index/columns 關鍵字#
drop() 方法已新增 `index`/`columns` 關鍵字,作為指定 `axis` 的替代方法。這類似於 `reindex` 的行為(GH 12392)。
例如:
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
In [9]: df.drop(['B', 'C'], axis=1)
Out[9]:
A D
0 0 3
1 4 7
# the following is now equivalent
In [10]: df.drop(columns=['B', 'C'])
Out[10]:
A D
0 0 3
1 4 7
方法 rename、reindex 現在也接受 axis 關鍵字#
DataFrame.rename() 和 `DataFrame.reindex()` 方法已新增 `axis` 關鍵字,用於指定操作的目標軸(GH 12392)。
以下是 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
In [13]: df.rename(id, axis='index')
Out[13]:
A B
94041066294888 1 4
94041066294920 2 5
94041066294952 3 6
以及 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
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
“index, columns” 樣式將繼續按原樣工作。
In [16]: df.rename(index=id, columns=str.lower)
Out[16]:
a b
94041066294888 1 4
94041066294920 2 5
94041066294952 3 6
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
我們強烈鼓勵使用命名引數,以避免在使用任一樣式時產生混淆。
CategoricalDtype 用於指定分類#
已將 pandas.api.types.CategoricalDtype 新增到公共 API,並擴充套件以包含 categories 和 ordered 屬性。 CategoricalDtype 可用於獨立於資料指定陣列的類別集和有序性。例如,這在將字串資料轉換為 Categorical 時非常有用(GH 14711,GH 15078,GH 16015,GH 17643)
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
dtype: category
Categories (4, str): ['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='str')
請注意“object” dtype。
使用包含所有數字、日期時間或時間差的 CategoricalDtype,我們可以自動轉換為正確的型別
In [24]: dtype = {'B': CategoricalDtype([1, 2, 3])}
In [25]: pd.read_csv(StringIO(data), dtype=dtype).B.cat.categories
Out[25]: Index([1, 2, 3], dtype='int64')
值已正確解析為整數。
現在,Categorical、CategoricalIndex 或具有分類型別的 Series 的 `.dtype` 屬性將返回一個 CategoricalDtype 例項。雖然 repr 已更改,但 str(CategoricalDtype()) 仍是字串 'category'。我們藉此機會提醒使用者,檢測分類資料的首選方法是使用 pandas.api.types.is_categorical_dtype(),而不是 str(dtype) == 'category'。
有關更多資訊,請參見 CategoricalDtype 文件。
GroupBy 物件現在有一個 pipe 方法#
GroupBy 物件現在有一個 pipe 方法,類似於 DataFrame 和 Series 上的方法,允許將接受 GroupBy 的函式以清晰、可讀的語法進行組合。(GH 17871)
例如,要組合 .groupby 和 .pipe,請設想一個包含商店、產品、收入和銷售數量列的 DataFrame。我們希望按商店和產品進行分組計算*價格*(即收入/數量)。我們可以分多步完成,但用管道表示可以使程式碼更易讀。
首先,我們設定資料
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
現在,要查詢按商店/產品計算的價格,我們可以簡單地這樣做
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
有關更多資訊,請參見 文件。
Categorical.rename_categories 接受類字典引數#
rename_categories() 現在接受 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, str): ['eh', 'bee']
警告
為了幫助升級 pandas,rename_categories 將 Series 視為類列表。通常,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]
其他增強功能#
新函式或方法#
添加了
Resampler.nearest()以支援最近鄰上取樣(GH 17496)。
新關鍵字#
向
infer_dtype()添加了skipna引數,以支援在存在缺失值的情況下進行型別推斷(GH 17059)。Series.to_dict()和DataFrame.to_dict()現在支援 `into` 關鍵字,允許您指定要返回的 `collections.Mapping` 子類。預設值為 `dict`,這是向後相容的。(GH 16122)Series.set_axis()和DataFrame.set_axis()現在支援 `inplace` 引數。(GH 14636)Series.to_pickle()和DataFrame.to_pickle()已獲得 `protocol` 引數(GH 16252)。預設情況下,此引數設定為 HIGHEST_PROTOCOLread_feather()已獲得 `nthreads` 引數,用於多執行緒操作(GH 16359)DataFrame.clip()和Series.clip()已獲得 `inplace` 引數。(GH 15388)crosstab()已獲得 `margins_name` 引數,用於在margins=True時定義包含總計的行/列的名稱。(GH 15972)read_json()現在接受 `chunksize` 引數,該引數可在 `lines=True` 時使用。如果傳遞了 `chunksize`,則 read_json 現在返回一個迭代器,該迭代器在每次迭代時讀取 `chunksize` 行。(GH 17048)read_json()和to_json()現在接受 `compression` 引數,該引數允許它們透明地處理壓縮檔案。(GH 17798)
各種增強功能#
將 pandas 的匯入時間提高了約 2.25 倍。(GH 16764)
支援大多數讀取器(例如
read_csv())和寫入器(例如DataFrame.to_csv())的 PEP 519 – 新增檔案系統路徑協議(GH 13823)。在
pd.HDFStore、pd.ExcelFile和pd.ExcelWriter中添加了 `__fspath__` 方法,以與檔案系統路徑協議正確配合(GH 13823)。merge()的 `validate` 引數現在會檢查合併是 一對一、一對多、多對一還是多對多。如果發現合併不是指定合併型別的示例,將引發 `MergeError` 型別的異常。有關更多資訊,請參閱 此處(GH 16270)。RangeIndex.append()現在在可能的情況下返回一個RangeIndex物件(GH 16212)。具有
inplace=True的Series.rename_axis()和DataFrame.rename_axis()現在在原地重新命名軸時返回None。(GH 15704)api.types.infer_dtype()現在可以推斷 decimal 型別。(GH 15690)DataFrame.select_dtypes()現在接受 `include`/`exclude` 的標量值以及列表值。(GH 16855)date_range()現在除了 'AS'(年初)之外,還接受 'YS' 作為別名。(GH 9313)date_range()現在除了 'A'(年末)之外,還接受 'Y' 作為別名。(GH 9313)DataFrame.add_prefix()和DataFrame.add_suffix()現在接受包含 '%' 字元的字串。(GH 17151)推斷壓縮的讀/寫方法(
read_csv()、read_table()、read_pickle()和to_pickle())現在可以從類路徑物件(如 `pathlib.Path`)進行推斷。(GH 17206)read_sas()現在可以識別 SAS7BDAT 檔案中更多最常用的日期(datetime)格式。(GH 15871)DataFrame.items()和Series.items()現在同時存在於 Python 2 和 3 中,並且在所有情況下都惰性化。(GH 13918,GH 17213)pandas.io.formats.style.Styler.where()已實現,作為pandas.io.formats.style.Styler.applymap()的便捷方法。(GH 17474)MultiIndex.is_monotonic_decreasing()已實現。先前在所有情況下都返回False。(GH 16554)read_excel()如果未安裝xlrd,則會引發ImportError,並附帶更清晰的錯誤訊息。(GH 17613)DataFrame.assign()將為 Python 3.6+ 使用者保留**kwargs的原始順序,而不是對列名進行排序。(GH 14207)Series.reindex()、DataFrame.reindex()、Index.get_indexer()現在支援tolerance的列表狀引數。(GH 17367)
向後不相容的 API 更改#
依賴項已增加最低版本#
我們已更新了依賴項的最低支援版本(GH 15206、GH 15543、GH 15214)。如果已安裝,我們現在要求
包
最低版本
必需
Numpy
1.9.0
X
Matplotlib
1.4.3
Scipy
0.14.0
Bottleneck
1.0.0
此外,已放棄對 Python 3.4 的支援(GH 15251)。
所有 NaN 或空的 Series/DataFrame 的 Sum/prod 現在一致地為 NaN#
注意
此處描述的更改已部分回滾。有關更多資訊,請參閱 v0.22.0 Whatsnew。
關於所有 NaN 的 Series/DataFrame 的 sum 和 prod 的行為不再依賴於是否安裝了 bottleneck,並且空 Series 的 sum 和 prod 的返回值已更改(GH 9422、GH 15507)。
對空或全 NaN Series 或 DataFrame 的列呼叫 sum 或 prod 將導致 NaN。請參閱 文件。
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
新行為,無論 bottleneck 是否安裝
In [34]: s.sum()
Out[34]: np.float64(0.0)
請注意,這也改變了空 Series 的總和。先前,無論是否安裝 bottleneck,這總是返回 0
In [1]: pd.Series([]).sum()
Out[1]: 0
但為了與全 NaN 的情況保持一致,這也已更改為返回 0
In [2]: pd.Series([]).sum()
Out[2]: 0
使用包含缺失標籤的列表進行索引已棄用#
先前,使用包含一個或多個缺失標籤的標籤列表進行選擇總是會成功,併為缺失的標籤返回 NaN。現在會顯示一個 FutureWarning。將來,這將引發一個 KeyError(GH 15747)。當在 DataFrame 或 Series 上使用 .loc[] 或 [[]] 並傳遞至少一個缺失標籤的標籤列表時,此警告將會觸發。
In [35]: s = pd.Series([1, 2, 3])
In [36]: s
Out[36]:
0 1
1 2
2 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.numpy.tw/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike
Out[4]:
1 2.0
2 3.0
3 NaN
dtype: float64
選擇可能找不到的元素的慣用方法是透過 .reindex()。
In [37]: s.reindex([1, 2, 3])
Out[37]:
1 2.0
2 3.0
3 NaN
dtype: float64
選擇所有找到的鍵保持不變。
In [38]: s.loc[[1, 2]]
Out[38]:
1 2
2 3
dtype: int64
NA 命名更改#
為了在 pandas API 中實現更一致的命名,我們添加了頂層函式 isna() 和 notna(),它們是 isnull() 和 notnull() 的別名。命名方案現在與 .dropna() 和 .fillna() 等方法更加一致。此外,在所有定義了 .isnull() 和 .notnull() 方法的情況下,還增加了名為 .isna() 和 .notna() 的方法,這些方法包含在 Categorical、Index、Series 和 DataFrame 類中。(GH 15001)。
配置選項 pd.options.mode.use_inf_as_null 已棄用,並添加了 pd.options.mode.use_inf_as_na 作為替代。
Series/Index 的迭代現在將返回 Python 標量#
先前,當對 dtype 為 int 或 float 的 Series 使用某些迭代方法時,會收到一個 numpy 標量,例如 np.int64,而不是 Python 的 int。問題(GH 10904)已為 Series.tolist() 和 list(Series) 修正了此問題。此更改使所有迭代方法保持一致,特別是對於 __iter__() 和 .map();請注意,這僅影響 int/float dtypes。(GH 13236、GH 13258、GH 14216)。
In [39]: s = pd.Series([1, 2, 3])
In [40]: s
Out[40]:
0 1
1 2
2 3
dtype: int64
先前
In [2]: type(list(s)[0])
Out[2]: numpy.int64
新行為
In [41]: type(list(s)[0])
Out[41]: int
此外,這也將正確地為 DataFrame.to_dict() 的迭代結果進行裝箱。
In [42]: d = {'a': [1], 'b': ['b']}
In [43]: df = pd.DataFrame(d)
先前
In [8]: type(df.to_dict()['a'][0])
Out[8]: numpy.int64
新行為
In [44]: type(df.to_dict()['a'][0])
Out[44]: int
使用布林索引進行索引#
先前,當將布林 Index 傳遞給 .loc 時,如果 Series/DataFrame 的索引具有 boolean 標籤,您將獲得基於標籤的選擇,可能重複結果標籤,而不是布林索引選擇(其中 True 選擇元素),這與布林 numpy 陣列的索引方式不一致。新行為是像布林 numpy 陣列索引器一樣工作。(GH 17738)
先前行為
In [45]: s = pd.Series([1, 2, 3], index=[False, True, False])
In [46]: s
Out[46]:
False 1
True 2
False 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 [47]: s.loc[pd.Index([True, False, True])]
Out[47]:
False 1
False 3
dtype: int64
此外,先前如果您有一個非數字索引(例如字串),則布林 Index 會引發 KeyError。現在將此視為布林索引器。
先前行為
In [48]: s = pd.Series([1, 2, 3], index=['a', 'b', 'c'])
In [49]: s
Out[49]:
a 1
b 2
c 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 [50]: s.loc[pd.Index([True, False, True])]
Out[50]:
a 1
c 3
dtype: int64
PeriodIndex 重取樣#
在 pandas 的先前版本中,對由 PeriodIndex 索引的 Series/DataFrame 進行重取樣,在某些情況下會返回 DatetimeIndex(GH 12884)。重取樣到乘法頻率現在返回 PeriodIndex(GH 15944)。作為一個小改進,重取樣 PeriodIndex 現在可以處理 NaT 值(GH 13224)。
先前行為
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 [51]: pi = pd.period_range('2017-01', periods=12, freq='M')
In [52]: s = pd.Series(np.arange(12), index=pi)
In [53]: resampled = s.resample('2Q').mean()
In [54]: resampled
Out[54]:
2017Q1 2.5
2017Q3 8.5
Freq: 2Q-DEC, dtype: float64
In [55]: resampled.index
Out[55]: PeriodIndex(['2017Q1', '2017Q3'], dtype='period[2Q-DEC]')
上取樣並呼叫 .ohlc() 先前返回一個 Series,基本上與呼叫 .asfreq() 相同。OHLC 上取樣現在返回一個具有 open、high、low 和 close 列的 DataFrame(GH 13083)。這與下采樣和 DatetimeIndex 行為一致。
先前行為
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 [56]: pi = pd.period_range(start='2000-01-01', freq='D', periods=10)
In [57]: s = pd.Series(np.arange(10), index=pi)
In [58]: s.resample('H').ohlc()
Out[58]:
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 [59]: s.resample('M').ohlc()
Out[59]:
open high low close
2000-01 0 9 0 9
[1 rows x 4 columns]
pd.eval 中項賦值的錯誤處理得到改進#
eval() 現在將在項賦值出現故障,或指定了原地操作但表示式中沒有項賦值時引發 ValueError(GH 16732)。
In [56]: 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
Dtype 轉換#
先前,賦值、.where() 和 .fillna()(帶有 bool 賦值)會將型別強制轉換為相同型別(例如 int/float),或對日期時間型別引發錯誤。現在,它們將使用 object dtypes 保留布林值。(GH 16821)。
In [57]: 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 [7]: s[1] = True
In [8]: s
Out[8]:
0 1
1 True
2 3
Length: 3, dtype: object
先前,將非日期時間型別分配給日期時間型別會強制轉換正在分配的非日期時間型別項(GH 14145)。
In [58]: 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 dtype。
In [1]: s[1] = 1
In [2]: s
Out[2]:
0 2011-01-01 00:00:00
1 1
dtype: object
單層 MultiIndex 建構函式#
MultiIndex 建構函式不再將所有層級長度為一的 MultiIndex 壓縮為常規 Index。這會影響所有 MultiIndex 建構函式。(GH 17178)。
先前行為
In [2]: pd.MultiIndex.from_tuples([('a',), ('b',)])
Out[2]: Index(['a', 'b'], dtype='object')
長度為 1 的層級不再被特殊處理。它們與長度為 2+ 的層級具有完全相同的行為,因此所有 MultiIndex 建構函式始終返回 MultiIndex。
In [59]: pd.MultiIndex.from_tuples([('a',), ('b',)])
Out[59]:
MultiIndex([('a',),
('b',)],
)
Series 的 UTC 本地化#
先前,當傳遞 utc=True 時,to_datetime() 不會本地化 datetime Series 資料。現在,to_datetime() 將正確地本地化具有 datetime64[ns, UTC] dtype 的 Series,以與列表狀和 Index 資料處理方式保持一致。(GH 6415)。
先前行為
In [60]: 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 [61]: pd.to_datetime(s, utc=True)
Out[61]:
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
dtype: datetime64[us, UTC]
此外,透過 read_sql_table() 和 read_sql_query() 解析的具有 datetime 列的 DataFrame 也將僅在原始 SQL 列是時區感知的 datetime 列時才本地化為 UTC。
範圍函式的連貫性#
在先前的版本中,各種範圍函式:date_range()、bdate_range()、period_range()、timedelta_range() 和 interval_range() 之間存在一些不一致之處。(GH 17471)。
不一致行為之一發生在當 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
此外,interval_range 生成的區間不包含終點引數 end。然而,所有其他範圍函式都將 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 [62]: pd.interval_range(start=0, end=4)
Out[62]: IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4]], dtype='interval[int64, right]')
無自動 Matplotlib 轉換器#
pandas 在匯入時不再將我們的 date、time、datetime、datetime64 和 Period 轉換器註冊到 matplotlib。Matplotlib 的繪圖方法(plt.plot、ax.plot 等)將不會很好地格式化 DatetimeIndex 或 PeriodIndex 值的 x 軸。您必須顯式註冊這些方法。
pandas 內建的 Series.plot 和 DataFrame.plot 在首次使用時 *會* 註冊這些轉換器(GH 17710)。
注意
此更改已在 pandas 0.21.1 中暫時回滾,更多詳情請參閱 此處。
其他 API 更改#
Categorical建構函式不再接受標量作為categories關鍵字引數。(GH 16022)訪問已關閉的
HDFStore的不存在的屬性現在將引發AttributeError而不是ClosedFileError(GH 16301)。read_csv()現在如果names引數包含重複項,會發出UserWarning(GH 17095)。pandas.HDFStore的字串表示形式現在更快、更詳細。對於之前的行為,請使用pandas.HDFStore.info()。(GH 16503)。HDF 儲存中的壓縮預設值現在遵循 pytables 標準。預設值為無壓縮,如果
complib缺失且complevel> 0,則使用zlib(GH 15943)。Index.get_indexer_non_unique()現在返回一個 ndarray indexer 而不是Index;這與Index.get_indexer()一致(GH 16819)。已從
pandas._testing中移除@slow裝飾器,該裝飾器導致某些下游包的測試套件出現問題。現在應使用@pytest.mark.slow,其效果相同(GH 16850)。將
MergeError的定義移至pandas.errors模組。Series.set_axis()和DataFrame.set_axis()的簽名已從set_axis(axis, labels)更改為set_axis(labels, axis=0),以與 API 的其餘部分保持一致。舊簽名已棄用,並將顯示FutureWarning(GH 14636)。Series.argmin()和Series.argmax()現在在使用objectdtypes 時將引發TypeError,而不是ValueError(GH 13595)。Period現在是不可變的,當用戶嘗試將新值分配給ordinal或freq屬性時,將引發AttributeError(GH 17116)。當
origin=kwarg 為時區感知時,to_datetime()現在將引發更具資訊量的ValueError而不是TypeError(GH 16842)。to_datetime()現在當格式包含%W或%U但未包含星期幾和日曆年時,會引發ValueError(GH 16774)。在
read_stata()中,已將非功能性的index重新命名為index_col,以提高 API 的一致性(GH 16342)。DataFrame.drop()中的錯誤導致布林標籤False和True在從數值索引中刪除索引時被視為標籤 0 和 1。現在將引發 ValueError(GH 16877)。限制了 DateOffset 的關鍵字引數。先前,
DateOffset子類允許任意關鍵字引數,這可能導致意外行為。現在,只接受有效引數。(GH 17176)。
棄用#
DataFrame.from_csv()和Series.from_csv()已棄用,推薦使用read_csv()(GH 4191)。read_excel()已棄用sheetname,改用sheet_name,以與.to_excel()保持一致(GH 10559)。read_excel()已棄用parse_cols,改用usecols,以與read_csv()保持一致(GH 4988)。read_csv()已棄用tupleize_cols引數。列元組將始終轉換為MultiIndex(GH 17060)。DataFrame.to_csv()已棄用tupleize_cols引數。MultiIndex 列將始終作為行寫入 CSV 檔案(GH 17060)。The
convertparameter has been deprecated in the.take()method, as it was not being respected (GH 16948)pd.options.html.borderhas been deprecated in favor ofpd.options.display.html.border(GH 15793).SeriesGroupBy.nth()has deprecatedTruein favor of'all'for its kwargdropna(GH 11038).DataFrame.as_blocks()is deprecated, as this is exposing the internal implementation (GH 17302)pd.TimeGrouperis deprecated in favor ofpandas.Grouper(GH 16747)cdate_rangehas been deprecated in favor ofbdate_range(), which has gainedweekmaskandholidaysparameters for building custom frequency date ranges. See the documentation for more details (GH 17596)passing
categoriesororderedkwargs toSeries.astype()is deprecated, in favor of passing a CategoricalDtype (GH 17636).get_valueand.set_valueonSeries,DataFrame,Panel,SparseSeries, andSparseDataFrameare deprecated in favor of using.iat[]or.at[]accessors (GH 15269)Passing a non-existent column in
.to_excel(..., columns=)is deprecated and will raise aKeyErrorin the future (GH 17295)raise_on_errorparameter toSeries.where(),Series.mask(),DataFrame.where(),DataFrame.mask()is deprecated, in favor oferrors=(GH 14968)Using
DataFrame.rename_axis()andSeries.rename_axis()to alter index or column labels is now deprecated in favor of using.rename.rename_axismay still be used to alter the name of the index or columns (GH 17833).reindex_axis()has been deprecated in favor ofreindex(). See here for more (GH 17833).
Series.select and DataFrame.select#
The Series.select() and DataFrame.select() methods are deprecated in favor of using df.loc[labels.map(crit)] (GH 12401)
In [63]: 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 [64]: df.loc[df.index.map(lambda x: x in ['bar', 'baz'])]
Out[64]:
A
bar 2
baz 3
Series.argmax and Series.argmin#
The behavior of Series.argmax() and Series.argmin() have been deprecated in favor of Series.idxmax() and Series.idxmin(), respectively (GH 16830).
For compatibility with NumPy arrays, pd.Series implements argmax and argmin. Since pandas 0.13.0, argmax has been an alias for pandas.Series.idxmax(), and argmin has been an alias for pandas.Series.idxmin(). They return the label of the maximum or minimum, rather than the position.
We’ve deprecated the current behavior of Series.argmax and Series.argmin. Using either of these will emit a FutureWarning. Use Series.idxmax() if you want the label of the maximum. Use Series.values.argmax() if you want the position of the maximum. Likewise for the minimum. In a future release Series.argmax and Series.argmin will return the position of the maximum or minimum.
移除先前版本的棄用/更改#
read_excel()has dropped thehas_index_namesparameter (GH 10967)The
pd.options.display.heightconfiguration has been dropped (GH 3663)The
pd.options.display.line_widthconfiguration has been dropped (GH 2881)The
pd.options.display.mpl_styleconfiguration has been dropped (GH 12190)Indexhas dropped the.sym_diff()method in favor of.symmetric_difference()(GH 12591)Categoricalhas dropped the.order()and.sort()methods in favor of.sort_values()(GH 12882)eval()andDataFrame.eval()have changed the default ofinplacefromNonetoFalse(GH 11149)The function
get_offset_namehas been dropped in favor of the.freqstrattribute for an offset (GH 11834)pandas no longer tests for compatibility with hdf5-files created with pandas < 0.11 (GH 17404).
效能改進#
Improved performance of instantiating
SparseDataFrame(GH 16773)Series.dtno longer performs frequency inference, yielding a large speedup when accessing the attribute (GH 17210)Improved performance of
set_categories()by not materializing the values (GH 17508)Timestamp.microsecondno longer re-computes on attribute access (GH 17331)Improved performance of the
CategoricalIndexfor data that is already categorical dtype (GH 17513)Improved performance of
RangeIndex.min()andRangeIndex.max()by usingRangeIndexproperties to perform the computations (GH 17607)
Documentation changes#
Bug 修復#
轉換#
Bug in assignment against datetime-like data with
intmay incorrectly convert to datetime-like (GH 14145)與
np.ndarray具有float64dtype 的int64資料賦值中的錯誤可能會保留int64dtype(GH 14001)。Fixed the return type of
IntervalIndex.is_non_overlapping_monotonicto be a Pythonboolfor consistency with similar attributes/methods. Previously returned anumpy.bool_. (GH 17237)Bug in
IntervalIndex.is_non_overlapping_monotonicwhen intervals are closed on both sides and overlap at a point (GH 16560)Bug in
Series.fillna()returns frame wheninplace=Trueandvalueis dict (GH 16156)Bug in
Timestamp.weekday_namereturning a UTC-based weekday name when localized to a timezone (GH 17354)Bug in
Timestamp.replacewhen replacingtzinfoaround DST changes (GH 15683)Bug in
Timedeltaconstruction and arithmetic that would not propagate theOverflowexception (GH 17367)Bug in
astype()converting to object dtype when passed extension type classes (DatetimeTZDtype,CategoricalDtype) rather than instances. Now aTypeErroris raised when a class is passed (GH 17780).Bug in
to_numeric()in which elements were not always being coerced to numeric whenerrors='coerce'(GH 17007, GH 17125)Bug in
DataFrameandSeriesconstructors whererangeobjects are converted toint32dtype on Windows instead ofint64(GH 16804)
索引#
When called with a null slice (e.g.
df.iloc[:]), the.ilocand.locindexers return a shallow copy of the original object. Previously they returned the original object. (GH 13873).When called on an unsorted
MultiIndex, thelocindexer now will raiseUnsortedIndexErroronly if proper slicing is used on non-sorted levels (GH 16734).Fixes regression in 0.20.3 when indexing with a string on a
TimedeltaIndex(GH 16896).Fixed
TimedeltaIndex.get_loc()handling ofnp.timedelta64inputs (GH 16909).Fix
MultiIndex.sort_index()ordering whenascendingargument is a list, but not all levels are specified, or are in a different order (GH 16934).Fixes bug where indexing with
np.infcaused anOverflowErrorto be raised (GH 16957)Bug in reindexing on an empty
CategoricalIndex(GH 16770)Fixes
DataFrame.locfor setting with alignment and tz-awareDatetimeIndex(GH 16889)Avoids
IndexErrorwhen passing an Index or Series to.ilocwith older numpy (GH 17193)Allow unicode empty strings as placeholders in multilevel columns in Python 2 (GH 17099)
Bug in
.ilocwhen used with inplace addition or assignment and an int indexer on aMultiIndexcausing the wrong indexes to be read from and written to (GH 17148)Bug in
.isin()in which checking membership in emptySeriesobjects raised an error (GH 16991)Bug in
CategoricalIndexreindexing in which specified indices containing duplicates were not being respected (GH 17323)Bug in intersection of
RangeIndexwith negative step (GH 17296)Bug in
IntervalIndexwhere performing a scalar lookup fails for included right endpoints of non-overlapping monotonic decreasing indexes (GH 16417, GH 17271)Bug in
DataFrame.first_valid_index()andDataFrame.last_valid_index()when no valid entry (GH 17400)Bug in
Series.rename()when called with a callable, incorrectly alters the name of theSeries, rather than the name of theIndex. (GH 17407)Bug in
String.str_get()raisesIndexErrorinstead of inserting NaNs when using a negative index. (GH 17704)
IO#
Bug in
read_hdf()when reading a timezone aware index fromfixedformat HDFStore (GH 17618)Bug in
read_csv()in which columns were not being thoroughly de-duplicated (GH 17060)Bug in
read_csv()in which specified column names were not being thoroughly de-duplicated (GH 17095)Bug in
read_csv()in which non integer values for the header argument generated an unhelpful / unrelated error message (GH 16338)Bug in
read_csv()in which memory management issues in exception handling, under certain conditions, would cause the interpreter to segfault (GH 14696, GH 16798).Bug in
read_csv()when called withlow_memory=Falsein which a CSV with at least one column > 2GB in size would incorrectly raise aMemoryError(GH 16798).Bug in
read_csv()when called with a single-element listheaderwould return aDataFrameof all NaN values (GH 7757)Bug in
DataFrame.to_csv()defaulting to ‘ascii’ encoding in Python 3, instead of ‘utf-8’ (GH 17097)Bug in
read_stata()where value labels could not be read when using an iterator (GH 16923)Bug in
read_stata()where the index was not set (GH 16342)Bug in
read_html()where import check fails when run in multiple threads (GH 16928)Bug in
read_csv()where automatic delimiter detection caused aTypeErrorto be thrown when a bad line was encountered rather than the correct error message (GH 13374)Bug in
DataFrame.to_html()withnotebook=Truewhere DataFrames with named indices or non-MultiIndex indices had undesired horizontal or vertical alignment for column or row labels, respectively (GH 16792)Bug in
DataFrame.to_html()in which there was no validation of thejustifyparameter (GH 17527)Bug in
HDFStore.select()when reading a contiguous mixed-data table featuring VLArray (GH 17021)Bug in
to_json()where several conditions (including objects with unprintable symbols, objects with deep recursion, overlong labels) caused segfaults instead of raising the appropriate exception (GH 14256)
繪圖#
Bug in plotting methods using
secondary_yandfontsizenot setting secondary axis font size (GH 12565)Bug when plotting
timedeltaanddatetimedtypes on y-axis (GH 16953)Line plots no longer assume monotonic x data when calculating xlims, they show the entire lines now even for unsorted x data. (GH 11310, GH 11471)
With matplotlib 2.0.0 and above, calculation of x limits for line plots is left to matplotlib, so that its new default settings are applied. (GH 15495)
Bug in
Series.plot.barorDataFrame.plot.barwithynot respecting user-passedcolor(GH 16822)Bug causing
plotting.parallel_coordinatesto reset the random seed when using random colors (GH 17525)
GroupBy/resample/rolling
Bug in
DataFrame.resample(...).size()where an emptyDataFramedid not return aSeries(GH 14962)Bug in
infer_freq()causing indices with 2-day gaps during the working week to be wrongly inferred as business daily (GH 16624)Bug in
.rolling(...).quantile()which incorrectly used different defaults thanSeries.quantile()andDataFrame.quantile()(GH 9413, GH 16211)Bug in
groupby.transform()that would coerce boolean dtypes back to float (GH 16875)Bug in
Series.resample(...).apply()where an emptySeriesmodified the source index and did not return the name of aSeries(GH 14313)Bug in
.rolling(...).apply(...)with aDataFramewith aDatetimeIndex, awindowof a timedelta-convertible andmin_periods >= 1(GH 15305)在
DataFrame.groupby中,當鍵的數量等於 groupby 軸上的元素數量時,索引和列鍵未被正確識別的錯誤(GH 16859)在
groupby.nunique()中使用TimeGrouper時,無法正確處理NaT的錯誤(GH 17575)在
DataFrame.groupby中,從MultiIndex進行單層選擇時意外排序的錯誤(GH 17537)在
DataFrame.groupby中,當使用Grouper物件覆蓋含糊的列名時,會引發虛假警告的錯誤(GH 17383)TimeGrouper作為列表和標量傳遞時行為不同的錯誤(GH 17530)
Sparse#
在
SparseSeries中,當字典作為資料傳入時引發AttributeError的錯誤(GH 16905)當
SparseDataFrame.fillna()從 SciPy 稀疏矩陣例項化時,未能填充所有 NaN 的錯誤(GH 16112)在
SparseSeries.unstack()和SparseDataFrame.stack()中的錯誤(GH 16614, GH 15045)在
make_sparse()中,當陣列dtype為object時,將具有相同位的兩個數字/布林資料視為相同的錯誤(GH 17574)SparseArray.all()和SparseArray.any()現在已實現以處理SparseArray,儘管它們曾被使用但未實現(GH 17570)
Reshaping#
與非唯一的
PeriodIndex進行連線/合併時引發TypeError的錯誤(GH 16871)在
crosstab()中,非對齊的整數系列被轉換為浮點數的錯誤(GH 17005)合併包含具有日期時間的類別 dtype 的資料時,錯誤地引發
TypeError的錯誤(GH 16900)在大型物件系列和大型比較陣列上使用
isin()時的錯誤(GH 16012)修復了 0.20 版本的迴歸,
Series.aggregate()和DataFrame.aggregate()允許字典作為返回值(GH 16741)修復了當
pivot_table()與margins=True一起呼叫時,整數 dtype 輸入結果的 dtype(GH 17013)在
crosstab()中,傳遞兩個同名Series時引發KeyError的錯誤(GH 13279)Series.argmin()、Series.argmax()以及它們在DataFrame和 groupby 物件上的對應方法,能夠正確處理包含無窮大值的浮點資料(GH 13595)。修復了 0.20 版本回歸的問題,當在包含
NaT值的datetime64dtypeSeries上按多個列排序時出現的問題(GH 16836)在
pivot_table()中,當dropna為False時,結果的列未能保留columns的類別 dtype 的錯誤(GH 17842)在
DataFrame.drop_duplicates中,使用非唯一的列名進行刪除時引發ValueError的錯誤(GH 17836)在
unstack()中,當對級別列表呼叫時,會丟棄fillna引數的錯誤(GH 13971)在
range物件和其他類列表物件與DataFrame對齊時,導致操作按行執行而非按列執行的錯誤(GH 17901)
數值#
在
.clip()中使用axis=1並傳遞類列表的threshold時,之前會引發ValueError的問題(GH 15390)Series.clip()和DataFrame.clip()現在將上限和下限引數中的 NA 值視為None,而不是引發ValueError(GH 17276)。
分類#
在呼叫
Series.isin()時,使用類別(categorical)時的錯誤(GH 16639)在類別建構函式中,使用空值和類別導致
.categories成為一個空的Float64Index,而不是一個具有 object dtype 的空的Index的錯誤(GH 17248)在類別操作中使用 Series.cat 時,未保留原始 Series 名稱的錯誤(GH 17509)
在
DataFrame.merge()中,對於布林/整數資料型別的類別列合併失敗的錯誤(GH 17187)在構造
Categorical/CategoricalDtype時,指定的categories為類別型別時的錯誤(GH 17884)。
PyPy#
在
usecols=[<unsorted ints>]的read_csv()和read_json()中與 PyPy 的相容性(GH 17351)將測試拆分為 CPython 和 PyPy 的情況(如果需要),這突顯了使用
float('nan')、np.nan和NAT進行索引匹配的脆弱性(GH 17351)修復
DataFrame.memory_usage()以支援 PyPy。PyPy 上的物件沒有固定大小,因此使用了近似值(GH 17228)
其他#
貢獻者#
本次釋出共有 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 +
margotphoenix +
matthiashuschle +
mattip
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 +