版本 0.21.0 (2017 年 10 月 27 日)#

這是從 0.20.3 版本開始的一個主要版本釋出,其中包含大量 API 更改、棄用、新功能、增強功能和效能改進,以及大量的錯誤修復。我們建議所有使用者升級到此版本。

亮點包括

  • Apache Parquet 整合,包括一個新的頂級函式 read_parquet() 和方法 DataFrame.to_parquet(),參見 此處

  • 面向使用者的新 pandas.api.types.CategoricalDtype,用於獨立於資料指定分類,參見 此處

  • 現在 sumprod 在全 NaN 的 Series/DataFrame 上的行為是一致的,不再依賴於是否安裝了 bottleneck,並且空 Series 上的 sumprod 現在返回 NaN 而不是 0,參見 此處

  • 與 pypy 的相容性修復,參見 此處

  • dropreindexrename API 的新增,使其更加一致,參見 此處

  • 添加了新方法 DataFrame.infer_objects(參見 此處)和 GroupBy.pipe(參見 此處)。

  • 使用標籤列表進行索引,如果其中一個或多個標籤缺失,將被棄用,並在未來版本中引發 KeyError,參見 此處

在更新之前,請檢查 API 更改棄用項

新功能#

與 Apache Parquet 檔案格式整合#

Apache Parquet 整合,包括一個全新的頂級函式 read_parquet() 和方法 DataFrame.to_parquet(),參見 此處GH 15838GH 17438)。

Apache Parquet 提供了一種跨語言的二進位制檔案格式,用於高效地讀取和寫入資料框。Parquet 旨在忠實地序列化和反序列化 DataFrame,支援所有 pandas 的 dtype,包括擴充套件 dtype,如帶時區的 datetime。

此功能取決於 pyarrowfastparquet 庫。有關更多詳細資訊,請參閱 關於 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

方法 renamereindex 現在也接受 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,並擴充套件以包含 categoriesordered 屬性。 CategoricalDtype 可用於獨立於資料指定陣列的類別集和有序性。例如,這在將字串資料轉換為 Categorical 時非常有用(GH 14711GH 15078GH 16015GH 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')

值已正確解析為整數。

現在,CategoricalCategoricalIndex 或具有分類型別的 Series 的 `.dtype` 屬性將返回一個 CategoricalDtype 例項。雖然 repr 已更改,但 str(CategoricalDtype()) 仍是字串 'category'。我們藉此機會提醒使用者,檢測分類資料的首選方法是使用 pandas.api.types.is_categorical_dtype(),而不是 str(dtype) == 'category'

有關更多資訊,請參見 CategoricalDtype 文件

GroupBy 物件現在有一個 pipe 方法#

GroupBy 物件現在有一個 pipe 方法,類似於 DataFrameSeries 上的方法,允許將接受 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_categoriesSeries 視為類列表。通常,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]

其他增強功能#

新函式或方法#

新關鍵字#

  • 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_PROTOCOL

  • read_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.HDFStorepd.ExcelFilepd.ExcelWriter 中添加了 `__fspath__` 方法,以與檔案系統路徑協議正確配合(GH 13823)。

  • merge() 的 `validate` 引數現在會檢查合併是 一對一、一對多、多對一還是多對多。如果發現合併不是指定合併型別的示例,將引發 `MergeError` 型別的異常。有關更多資訊,請參閱 此處GH 16270)。

  • 向構建系統添加了對 PEP 518pyproject.toml)的支援(GH 16745)。

  • RangeIndex.append() 現在在可能的情況下返回一個 RangeIndex 物件(GH 16212)。

  • 具有 inplace=TrueSeries.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 13918GH 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 15206GH 15543GH 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 的 sumprod 的行為不再依賴於是否安裝了 bottleneck,並且空 Series 的 sumprod 的返回值已更改(GH 9422GH 15507)。

對空或全 NaN SeriesDataFrame 的列呼叫 sumprod 將導致 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。將來,這將引發一個 KeyErrorGH 15747)。當在 DataFrameSeries 上使用 .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() 的方法,這些方法包含在 CategoricalIndexSeriesDataFrame 類中。(GH 15001)。

配置選項 pd.options.mode.use_inf_as_null 已棄用,並添加了 pd.options.mode.use_inf_as_na 作為替代。

Series/Index 的迭代現在將返回 Python 標量#

先前,當對 dtype 為 intfloatSeries 使用某些迭代方法時,會收到一個 numpy 標量,例如 np.int64,而不是 Python 的 int。問題(GH 10904)已為 Series.tolist()list(Series) 修正了此問題。此更改使所有迭代方法保持一致,特別是對於 __iter__().map();請注意,這僅影響 int/float dtypes。(GH 13236GH 13258GH 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 進行重取樣,在某些情況下會返回 DatetimeIndexGH 12884)。重取樣到乘法頻率現在返回 PeriodIndexGH 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 上取樣現在返回一個具有 openhighlowclose 列的 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() 現在將在項賦值出現故障,或指定了原地操作但表示式中沒有項賦值時引發 ValueErrorGH 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
  • .where() 中與日期時間型別相關的行為不一致,該行為會引發錯誤而不是強制轉換為 objectGH 16402)。

  • np.ndarray 具有 float64 dtype 的 int64 資料賦值中的錯誤可能會保留 int64 dtype(GH 14001)。

單層 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)。

不一致行為之一發生在當 startendperiod 引數都被指定時,可能導致不明確的範圍。當三個引數都傳遞時,interval_range 忽略了 period 引數,period_range 忽略了 end 引數,而其他範圍函式則引發錯誤。為了在範圍函式之間實現一致性,並避免可能不明確的範圍,當三個引數都傳遞時,interval_rangeperiod_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 在匯入時不再將我們的 datetimedatetimedatetime64Period 轉換器註冊到 matplotlib。Matplotlib 的繪圖方法(plt.plotax.plot 等)將不會很好地格式化 DatetimeIndexPeriodIndex 值的 x 軸。您必須顯式註冊這些方法。

pandas 內建的 Series.plotDataFrame.plot 在首次使用時 *會* 註冊這些轉換器(GH 17710)。

注意

此更改已在 pandas 0.21.1 中暫時回滾,更多詳情請參閱 此處

其他 API 更改#

  • Categorical 建構函式不再接受標量作為 categories 關鍵字引數。(GH 16022

  • 訪問已關閉的 HDFStore 的不存在的屬性現在將引發 AttributeError 而不是 ClosedFileErrorGH 16301)。

  • read_csv() 現在如果 names 引數包含重複項,會發出 UserWarningGH 17095)。

  • read_csv() 現在預設將 'null''n/a' 字串視為缺失值(GH 16471GH 16078)。

  • pandas.HDFStore 的字串表示形式現在更快、更詳細。對於之前的行為,請使用 pandas.HDFStore.info()。(GH 16503)。

  • HDF 儲存中的壓縮預設值現在遵循 pytables 標準。預設值為無壓縮,如果 complib 缺失且 complevel > 0,則使用 zlibGH 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 的其餘部分保持一致。舊簽名已棄用,並將顯示 FutureWarningGH 14636)。

  • Series.argmin()Series.argmax() 現在在使用 object dtypes 時將引發 TypeError,而不是 ValueErrorGH 13595)。

  • Period 現在是不可變的,當用戶嘗試將新值分配給 ordinalfreq 屬性時,將引發 AttributeErrorGH 17116)。

  • origin= kwarg 為時區感知時,to_datetime() 現在將引發更具資訊量的 ValueError 而不是 TypeErrorGH 16842)。

  • to_datetime() 現在當格式包含 %W%U 但未包含星期幾和日曆年時,會引發 ValueErrorGH 16774)。

  • read_stata() 中,已將非功能性的 index 重新命名為 index_col,以提高 API 的一致性(GH 16342)。

  • DataFrame.drop() 中的錯誤導致布林標籤 FalseTrue 在從數值索引中刪除索引時被視為標籤 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 引數。列元組將始終轉換為 MultiIndexGH 17060)。

  • DataFrame.to_csv() 已棄用 tupleize_cols 引數。MultiIndex 列將始終作為行寫入 CSV 檔案(GH 17060)。

  • The convert parameter has been deprecated in the .take() method, as it was not being respected (GH 16948)

  • pd.options.html.border has been deprecated in favor of pd.options.display.html.border (GH 15793).

  • SeriesGroupBy.nth() has deprecated True in favor of 'all' for its kwarg dropna (GH 11038).

  • DataFrame.as_blocks() is deprecated, as this is exposing the internal implementation (GH 17302)

  • pd.TimeGrouper is deprecated in favor of pandas.Grouper (GH 16747)

  • cdate_range has been deprecated in favor of bdate_range(), which has gained weekmask and holidays parameters for building custom frequency date ranges. See the documentation for more details (GH 17596)

  • passing categories or ordered kwargs to Series.astype() is deprecated, in favor of passing a CategoricalDtype (GH 17636)

  • .get_value and .set_value on Series, DataFrame, Panel, SparseSeries, and SparseDataFrame are 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 a KeyError in the future (GH 17295)

  • raise_on_error parameter to Series.where(), Series.mask(), DataFrame.where(), DataFrame.mask() is deprecated, in favor of errors= (GH 14968)

  • Using DataFrame.rename_axis() and Series.rename_axis() to alter index or column labels is now deprecated in favor of using .rename. rename_axis may still be used to alter the name of the index or columns (GH 17833).

  • reindex_axis() has been deprecated in favor of reindex(). 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 the has_index_names parameter (GH 10967)

  • The pd.options.display.height configuration has been dropped (GH 3663)

  • The pd.options.display.line_width configuration has been dropped (GH 2881)

  • The pd.options.display.mpl_style configuration has been dropped (GH 12190)

  • Index has dropped the .sym_diff() method in favor of .symmetric_difference() (GH 12591)

  • Categorical has dropped the .order() and .sort() methods in favor of .sort_values() (GH 12882)

  • eval() and DataFrame.eval() have changed the default of inplace from None to False (GH 11149)

  • The function get_offset_name has been dropped in favor of the .freqstr attribute 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.dt no 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.microsecond no longer re-computes on attribute access (GH 17331)

  • Improved performance of the CategoricalIndex for data that is already categorical dtype (GH 17513)

  • Improved performance of RangeIndex.min() and RangeIndex.max() by using RangeIndex properties to perform the computations (GH 17607)

Documentation changes#

Bug 修復#

轉換#

  • Bug in assignment against datetime-like data with int may incorrectly convert to datetime-like (GH 14145)

  • np.ndarray 具有 float64 dtype 的 int64 資料賦值中的錯誤可能會保留 int64 dtype(GH 14001)。

  • Fixed the return type of IntervalIndex.is_non_overlapping_monotonic to be a Python bool for consistency with similar attributes/methods. Previously returned a numpy.bool_. (GH 17237)

  • Bug in IntervalIndex.is_non_overlapping_monotonic when intervals are closed on both sides and overlap at a point (GH 16560)

  • Bug in Series.fillna() returns frame when inplace=True and value is dict (GH 16156)

  • Bug in Timestamp.weekday_name returning a UTC-based weekday name when localized to a timezone (GH 17354)

  • Bug in Timestamp.replace when replacing tzinfo around DST changes (GH 15683)

  • Bug in Timedelta construction and arithmetic that would not propagate the Overflow exception (GH 17367)

  • Bug in astype() converting to object dtype when passed extension type classes (DatetimeTZDtype, CategoricalDtype) rather than instances. Now a TypeError is raised when a class is passed (GH 17780).

  • Bug in to_numeric() in which elements were not always being coerced to numeric when errors='coerce' (GH 17007, GH 17125)

  • Bug in DataFrame and Series constructors where range objects are converted to int32 dtype on Windows instead of int64 (GH 16804)

索引#

  • When called with a null slice (e.g. df.iloc[:]), the .iloc and .loc indexers return a shallow copy of the original object. Previously they returned the original object. (GH 13873).

  • When called on an unsorted MultiIndex, the loc indexer now will raise UnsortedIndexError only 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 of np.timedelta64 inputs (GH 16909).

  • Fix MultiIndex.sort_index() ordering when ascending argument is a list, but not all levels are specified, or are in a different order (GH 16934).

  • Fixes bug where indexing with np.inf caused an OverflowError to be raised (GH 16957)

  • Bug in reindexing on an empty CategoricalIndex (GH 16770)

  • Fixes DataFrame.loc for setting with alignment and tz-aware DatetimeIndex (GH 16889)

  • Avoids IndexError when passing an Index or Series to .iloc with older numpy (GH 17193)

  • Allow unicode empty strings as placeholders in multilevel columns in Python 2 (GH 17099)

  • Bug in .iloc when used with inplace addition or assignment and an int indexer on a MultiIndex causing the wrong indexes to be read from and written to (GH 17148)

  • Bug in .isin() in which checking membership in empty Series objects raised an error (GH 16991)

  • Bug in CategoricalIndex reindexing in which specified indices containing duplicates were not being respected (GH 17323)

  • Bug in intersection of RangeIndex with negative step (GH 17296)

  • Bug in IntervalIndex where 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() and DataFrame.last_valid_index() when no valid entry (GH 17400)

  • Bug in Series.rename() when called with a callable, incorrectly alters the name of the Series, rather than the name of the Index. (GH 17407)

  • Bug in String.str_get() raises IndexError instead of inserting NaNs when using a negative index. (GH 17704)

IO#

  • Bug in read_hdf() when reading a timezone aware index from fixed format 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 with low_memory=False in which a CSV with at least one column > 2GB in size would incorrectly raise a MemoryError (GH 16798).

  • Bug in read_csv() when called with a single-element list header would return a DataFrame of 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 a TypeError to be thrown when a bad line was encountered rather than the correct error message (GH 13374)

  • Bug in DataFrame.to_html() with notebook=True where 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 the justify parameter (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_y and fontsize not setting secondary axis font size (GH 12565)

  • Bug when plotting timedelta and datetime dtypes 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.bar or DataFrame.plot.bar with y not respecting user-passed color (GH 16822)

  • Bug causing plotting.parallel_coordinates to reset the random seed when using random colors (GH 17525)

GroupBy/resample/rolling

  • Bug in DataFrame.resample(...).size() where an empty DataFrame did not return a Series (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 than Series.quantile() and DataFrame.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 empty Series modified the source index and did not return the name of a Series (GH 14313)

  • Bug in .rolling(...).apply(...) with a DataFrame with a DatetimeIndex, a window of a timedelta-convertible and min_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() 中,當陣列 dtypeobject 時,將具有相同位的兩個數字/布林資料視為相同的錯誤(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)。

  • unique() 中,檢查字串元組時引發 TypeError 的錯誤(GH 17108

  • concat() 中,當結果索引包含不可比較的元素時,索引順序不可預測的錯誤(GH 17344

  • 修復了 0.20 版本回歸的問題,當在包含 NaT 值的 datetime64 dtype Series 上按多個列排序時出現的問題(GH 16836

  • pivot_table() 中,當 dropnaFalse 時,結果的列未能保留 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,而不是引發 ValueErrorGH 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.nanNAT 進行索引匹配的脆弱性(GH 17351

  • 修復 DataFrame.memory_usage() 以支援 PyPy。PyPy 上的物件沒有固定大小,因此使用了近似值(GH 17228

其他#

  • 某些原地運算子未被包裝,呼叫時產生副本的錯誤(GH 12962

  • eval() 中,inplace 引數被錯誤處理的錯誤(GH 16732

貢獻者#

本次釋出共有 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 +