バージョン 0.21.0 (2017年10月27日)#

これは0.20.3からのメジャーリリースであり、多数のAPI変更、非推奨、新機能、機能強化、パフォーマンス改善、そして多数のバグ修正が含まれています。すべてのユーザーにこのバージョンへのアップグレードをお勧めします。

主な機能は以下の通りです。

  • Apache Parquet との統合。これには、新しいトップレベルの read_parquet() 関数と DataFrame.to_parquet() メソッドが含まれます。詳細はこちらを参照してください。

  • データから独立してカテゴリカルを指定するための新しいユーザー向け pandas.api.types.CategoricalDtype。詳細はこちらを参照してください。

  • すべてのNaNのSeries/DataFrameに対する sumprod の挙動が統一され、bottleneck がインストールされているかどうかに依存しなくなりました。また、空のSeriesに対する sumprod は0ではなくNaNを返すようになりました。詳細はこちらを参照してください。

  • pypyの互換性修正。詳細はこちらを参照してください。

  • dropreindexrename のAPIに追加が加えられ、より一貫性のあるものになりました。詳細はこちらを参照してください。

  • 新しいメソッド DataFrame.infer_objects (詳細はこちら) と GroupBy.pipe (詳細はこちら) の追加。

  • ラベルのリストを使ったインデックス付けで、1つ以上のラベルが欠落している場合が非推奨となり、将来のバージョンではKeyErrorが発生します。詳細はこちらを参照してください。

更新前にAPIの変更点非推奨事項を確認してください。

新機能#

Apache Parquetファイル形式との統合#

Apache Parquet との統合。これには、新しいトップレベルの read_parquet() 関数と DataFrame.to_parquet() メソッドが含まれます。詳細はこちらを参照してください (GH 15838, GH 17438)。

Apache Parquet は、データフレームを効率的に読み書きするための、クロス言語のバイナリファイル形式を提供します。Parquetは、タイムゾーン付きのdatetimeなどの拡張dtypeを含む、すべてのpandas dtypeをサポートし、DataFrame を忠実にシリアル化およびデシリアル化するように設計されています。

この機能は、pyarrow または fastparquet ライブラリのいずれかに依存します。詳細については、Parquetに関するIOドキュメントを参照してください。

メソッド infer_objects タイプ変換#

DataFrame.infer_objects()Series.infer_objects() メソッドが追加され、非推奨の convert_objects メソッドのいくつかの機能を置き換える形で、オブジェクト列のdtype推論を実行します。詳細については、こちらのドキュメントを参照してください。(GH 11221

このメソッドは、オブジェクト列に対してソフト変換のみを実行し、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 インスタンスの列操作と属性アクセスの関係にしばしば戸惑います (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() メソッドは、axis を指定する代替として index/columns キーワードを受け入れるようになりました。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

[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]

メソッド 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

[3 rows x 2 columns]

In [13]: df.rename(id, axis='index')
Out[13]: 
                 A  B
140277028225232  1  4
140277028225264  2  5
140277028225296  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]

「index, columns」の形式は以前と同様に機能します。

In [16]: df.rename(index=id, columns=str.lower)
Out[16]: 
                 a  b
140277028225232  1  4
140277028225264  2  5
140277028225296  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 が公開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
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」の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' です。ここで、カテゴリデータを検出するための*推奨される*方法は、str(dtype) == 'category' ではなく、pandas.api.types.is_categorical_dtype() を使用することであることをユーザーに思い出させます。

詳細については、CategoricalDtypeドキュメントを参照してください。

GroupBy オブジェクトに pipe メソッドが追加されました。#

GroupBy オブジェクトに DataFrame および Series と同様の pipe メソッドが追加され、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

[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]

詳細については、ドキュメントを参照してください。

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, object): ['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]

その他の機能強化#

新機能またはメソッド#

  • Resampler.nearest() が、最近傍アップサンプリングをサポートするために追加されました (GH 17496)。

  • Index は、to_frame メソッドのサポートを追加しました (GH 15230)。

新しいキーワード#

  • 欠損値が存在する場合の型推論をサポートするために、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=True の場合に合計を含む行/列の名前を定義する margins_name パラメータを受け入れるようになりました。(GH 15972

  • read_json() は、lines=True の場合に使用できる chunksize パラメータを受け入れるようになりました。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.ExcelFile、および pd.ExcelWriter__fspath__ メソッドが追加され、ファイルシステムパスプロトコルと適切に連携するようになりました (GH 13823)。

  • merge()validate 引数が、マージが一対一、一対多、多対一、または多対多であるかどうかをチェックするようになりました。指定されたマージタイプに該当しないマージが見つかった場合、MergeError 型の例外が生成されます。詳細については、こちらを参照してください (GH 16270)。

  • ビルドシステムにPEP 518 (pyproject.toml) のサポートを追加しました (GH 16745)。

  • RangeIndex.append() が、可能な場合に RangeIndex オブジェクトを返すようになりました (GH 16212)。

  • Series.rename_axis() および DataFrame.rename_axis()inplace=True を指定した場合、軸名をインプレースで変更する際に None を返すようになりました。(GH 15704

  • api.types.infer_dtype() が小数を推論するようになりました。(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)。

空の Series、またはすべての NaNSeries、または 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

ボトルネックのインストールに関係なく、新しい動作

In [34]: s.sum()
Out[34]: 0.0

これにより、空の Series の合計も変更されることに注意してください。以前は、bottleneck のインストールに関係なく、常に0を返していました。

In [1]: pd.Series([]).sum()
Out[1]: 0

しかし、すべてのNaNのケースとの一貫性のために、これも0を返すように変更されました。

In [2]: pd.Series([]).sum()
Out[2]: 0

欠落したラベルを含むリストによるインデックス付けは非推奨です。#

以前は、ラベルのリストで選択する場合、1つ以上のラベルが欠落していても常に成功し、欠落したラベルに対して NaN が返されていました。これは現在 FutureWarning を表示します。将来のバージョンでは KeyError が発生します (GH 15747)。この警告は、少なくとも1つの欠落したラベルを含むラベルのリストを渡して .loc[] または [[]] を使用する際に、DataFrame または Series でトリガーされます。

In [35]: s = pd.Series([1, 2, 3])

In [36]: s
Out[36]: 
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.dokyumento.jp/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
Length: 3, dtype: float64

すべてのキーが見つかった場合の選択は変更されません。

In [38]: s.loc[[1, 2]]
Out[38]: 
1    2
2    3
Length: 2, dtype: int64

NAの命名変更#

pandas API間の一貫性をさらに高めるため、isnull()notnull() のエイリアスである追加のトップレベル関数 isna()notna() を追加しました。この命名スキームは、.dropna().fillna() といったメソッドとより一貫性があります。さらに、.isnull().notnull() メソッドが定義されているすべてのケースで、.isna().notna() という追加のメソッドが含まれています。これらは CategoricalIndexSeries、および DataFrame のクラスに含まれます。(GH 15001)。

設定オプション pd.options.mode.use_inf_as_null は非推奨となり、代わりに pd.options.mode.use_inf_as_na が追加されました。

Series/IndexのイテレーションはPythonのスカラーを返すようになりました。#

以前は、dtype が int または floatSeries に対して特定のイテレーションメソッドを使用すると、Python の int ではなく numpy スカラー、例えば np.int64 が返されていました。問題 (GH 10904) は、Series.tolist() および list(Series) についてこれを修正しました。この変更により、すべてのイテレーションメソッド、特に __iter__() および .map() について一貫性が保たれます。なお、これは int/float の dtype にのみ影響します。(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
Length: 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
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 [47]: s.loc[pd.Index([True, False, True])]
Out[47]: 
False    1
False    3
Length: 2, dtype: int64

さらに、以前は数値以外のインデックス(例:文字列)を持っていた場合、ブールインデックスは KeyError を発生させていました。これは現在、ブールインデクサとして扱われます。

以前の動作

In [48]: s = pd.Series([1, 2, 3], index=['a', 'b', 'c'])

In [49]: s
Out[49]: 
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 [50]: s.loc[pd.Index([True, False, True])]
Out[50]: 
a    1
c    3
Length: 2, 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 [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]:
2017Q1    2.5
2017Q3    8.5
Freq: 2Q-DEC, dtype: float64

In [5]: resampled.index
Out[5]: PeriodIndex(['2017Q1', '2017Q3'], dtype='period[2Q-DEC]')

アップサンプリングして .ohlc() を呼び出すと、以前は .asfreq() を呼び出すのと基本的に同じ Series が返されていました。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() は、項目代入が失敗した場合、またはインプレース操作が指定されているにもかかわらず式に項目代入がない場合に、ValueError を発生させるようになりました。(GH 16732

In [51]: 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() でブール値を代入すると、同じ型(例:int / float)に強制されるか、datetimeライクではエラーが発生しました。これらは現在、object dtype でブール値を保持します。(GH 16821)。

In [52]: 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

以前は、datetimeライクなものへの非datetimeライクな代入は、代入される非datetimeライクなアイテムを強制的に変換していました。(GH 14145)。

In [53]: 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
  • datetimeライクなオブジェクトに対する .where() の inconsistentな挙動(object に強制変換されずに例外を発生させていました)(GH 16402

  • int64 データに対する np.ndarray (dtypeが float64) による代入で、int64 dtype が維持される場合があるバグ (GH 14001)。

単一レベルを持つMultiIndexコンストラクタ#

MultiIndex コンストラクターは、すべての長さ1のレベルを持つ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 [54]: pd.MultiIndex.from_tuples([('a',), ('b',)])
Out[54]: 
MultiIndex([('a',),
            ('b',)],
           )

SeriesによるUTCローカライゼーション#

以前は、to_datetime() は、utc=True が渡されても datetime Series データをローカライズしませんでした。現在、to_datetime() は、リストライクおよび Index データが処理される方法と一貫性を持たせるために、datetime64[ns, UTC] dtype を持つ Series を正しくローカライズします。(GH 6415)。

以前の動作

In [55]: 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 [56]: pd.to_datetime(s, utc=True)
Out[56]: 
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]

さらに、read_sql_table() および read_sql_query() によってパースされた datetime 列を持つDataFrameも、元のSQL列がタイムゾーン対応の datetime 列であった場合にのみUTCにローカライズされます。

範囲関数の一貫性#

以前のバージョンでは、様々な範囲関数である date_range()bdate_range()period_range()timedelta_range()、および interval_range() の間にいくつかの矛盾がありました。(GH 17471)。

矛盾した動作の1つは、startendperiod のすべてのパラメータが指定された場合に発生し、曖昧な範囲につながる可能性がありました。これら3つのパラメータすべてが渡された場合、interval_rangeperiod パラメータを無視し、period_rangeend パラメータを無視し、他の範囲関数は例外を発生させました。範囲関数間の一貫性を促進し、曖昧な範囲の可能性を避けるために、interval_rangeperiod_range は、これら3つのパラメータすべてが渡された場合に例外を発生させるようになりました。

以前の動作

 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

さらに、エンドポイントパラメータ endinterval_range によって生成された区間には含まれていませんでした。しかし、他のすべての範囲関数は出力に end を含んでいます。範囲関数間の一貫性を促進するために、interval_range は、freqend をスキップする方法で指定されていない限り、最終区間の右端点として 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 [57]: pd.interval_range(start=0, end=4)
Out[57]: IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4]], dtype='interval[int64, right]')

自動的なMatplotlibコンバーターなし#

pandasがインポートされても、Matplotlibに datetimedatetimedatetime64、および Period コンバーターを自動的に登録しなくなりました。Matplotlibのプロットメソッド(plt.plotax.plot、...)は、DatetimeIndex または PeriodIndex の値に対してx軸を適切にフォーマットしません。これらのメソッドを明示的に登録する必要があります。

pandas組み込みの Series.plot および DataFrame.plot は、初回使用時にこれらのコンバーターを登録します (GH 17710)。

この変更はpandas 0.21.1で一時的に元に戻されました。詳細についてはこちらを参照してください。

その他の API の変更#

  • Categoricalコンストラクタは、categories キーワードにスカラーを受け入れなくなりました。(GH 16022

  • 閉じられた HDFStore で存在しない属性にアクセスすると、ClosedFileError ではなく AttributeError が発生するようになりました。(GH 16301

  • read_csv() は、names パラメータに重複が含まれている場合に UserWarning を発行するようになりました。(GH 17095

  • read_csv() は、デフォルトで 'null' および 'n/a' 文字列を欠損値として扱うようになりました。(GH 16471, GH 16078

  • pandas.HDFStore の文字列表現が高速化され、詳細度が低下しました。以前の動作については、pandas.HDFStore.info() を使用してください。(GH 16503)。

  • HDFストアの圧縮のデフォルトは、現在pytablesの標準に従っています。デフォルトは圧縮なしで、complib がなく、complevel > 0 の場合は zlib が使用されます。(GH 15943

  • Index.get_indexer_non_unique() は、Index ではなく ndarray のインデクサを返すようになりました。これは Index.get_indexer() と一貫しています。(GH 16819

  • pandas._testing から @slow デコレータを削除しました。これにより、一部のダウンストリームパッケージのテストスイートで問題が発生していました。代わりに @pytest.mark.slow を使用してください。これは同じことを達成します。(GH 16850

  • MergeError の定義を pandas.errors モジュールに移動しました。

  • Series.set_axis() および DataFrame.set_axis() のシグネチャが、APIの残りの部分と一貫性を持たせるために set_axis(axis, labels) から set_axis(labels, axis=0) に変更されました。古いシグネチャは非推奨であり、FutureWarning を表示します。(GH 14636

  • Series.argmin() および Series.argmax() は、object dtypes とともに使用された場合、ValueError ではなく TypeError を発生させるようになりました。(GH 13595

  • Period はイミュータブルになり、ユーザーが ordinal または freq 属性に新しい値を代入しようとすると AttributeError を発生させるようになりました。(GH 17116)。

  • to_datetime() は、tz-awareな origin= kwargが渡された場合、TypeError ではなく、より詳細な ValueError を発生させるようになりました。(GH 16842

  • to_datetime() は、フォーマットに %W または %U が含まれていて、同時に曜日と暦年が含まれていない場合に ValueError を発生させるようになりました。(GH 16774

  • read_stata() において、非機能的な indexindex_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() は、.to_excel() との整合性のため、sheetnamesheet_name に変更しました (GH 10559)。

  • read_excel() は、read_csv() との整合性のため、parse_colsusecols に変更しました (GH 4988)

  • read_csv()tupleize_cols 引数を非推奨にしました。列のタプルは常に MultiIndex に変換されます (GH 17060)

  • DataFrame.to_csv()tupleize_cols 引数を非推奨にしました。MultiIndex の列は常に CSV ファイルに行として書き込まれます (GH 17060)

  • .take() メソッドの convert パラメータは、尊重されていなかったため非推奨になりました (GH 16948)

  • pd.options.html.borderpd.options.display.html.border に変更されました (GH 15793)。

  • SeriesGroupBy.nth() は、dropna kwarg の True'all' に変更しました (GH 11038)。

  • DataFrame.as_blocks() は内部実装を公開しているため非推奨になりました (GH 17302)

  • pd.TimeGrouperpandas.Grouper に変更されました (GH 16747)

  • cdate_range は、カスタム頻度の日付範囲を構築するために weekmask および holidays パラメータを取得した bdate_range() に変更されました。詳細についてはドキュメントを参照してください (GH 17596)

  • Series.astype()categories または ordered kwarg を渡すことは非推奨になりました。CategoricalDtype を渡すようにしてください (GH 17636)

  • SeriesDataFramePanelSparseSeries、および SparseDataFrame.get_value および .set_value は、.iat[] または .at[] アクセサの使用に変更されました (GH 15269)

  • .to_excel(..., columns=) で存在しない列を渡すことは非推奨であり、将来的には KeyError が発生します (GH 17295)

  • Series.where()Series.mask()DataFrame.where()DataFrame.mask()raise_on_error パラメータは、errors= に変更されました (GH 14968)

  • DataFrame.rename_axis() および Series.rename_axis() を使用してインデックスまたは列の*ラベル*を変更することは、.rename の使用に変更されました。rename_axis は引き続きインデックスまたは列の名前を変更するために使用できます (GH 17833)。

  • reindex_axis()reindex() に変更されました。詳細についてはこちらを参照してください (GH 17833)。

Series.select と DataFrame.select#

Series.select() および DataFrame.select() メソッドは、df.loc[labels.map(crit)] の使用に変更されました (GH 12401)

In [58]: 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 [59]: df.loc[df.index.map(lambda x: x in ['bar', 'baz'])]
Out[59]: 
     A
bar  2
baz  3

[2 rows x 1 columns]

Series.argmax と Series.argmin#

Series.argmax() および Series.argmin() の動作は、それぞれ Series.idxmax() および Series.idxmin() に変更されました (GH 16830)。

NumPy 配列との互換性のため、pd.Seriesargmax および argmin を実装しています。pandas 0.13.0 以降、argmaxpandas.Series.idxmax() のエイリアスであり、argminpandas.Series.idxmin() のエイリアスです。これらは*位置*ではなく、最大値または最小値の*ラベル*を返します。

Series.argmax および Series.argmin の現在の動作は非推奨になりました。これらを使用すると FutureWarning が発生します。最大値のラベルが必要な場合は Series.idxmax() を使用してください。最大値の位置が必要な場合は Series.values.argmax() を使用してください。最小値についても同様です。将来のリリースでは、Series.argmax および Series.argmin は最大値または最小値の位置を返します。

以前のバージョンの非推奨/変更の削除#

  • read_excel()has_index_names パラメータを削除しました (GH 10967)

  • pd.options.display.height 設定は削除されました (GH 3663)

  • pd.options.display.line_width 設定は削除されました (GH 2881)

  • pd.options.display.mpl_style 設定は削除されました (GH 12190)

  • Index.sym_diff() メソッドを .symmetric_difference() に変更しました (GH 12591)

  • Categorical.order() および .sort() メソッドを .sort_values() に変更しました (GH 12882)

  • eval() および DataFrame.eval() は、inplace のデフォルトを None から False に変更しました (GH 11149)

  • get_offset_name 関数は、オフセットの .freqstr 属性に変更されました (GH 11834)

  • pandas は、pandas < 0.11 で作成された hdf5 ファイルとの互換性をテストしなくなりました (GH 17404)。

パフォーマンス改善#

  • SparseDataFrame のインスタンス化のパフォーマンスが向上しました (GH 16773)

  • Series.dt は頻度推論を実行しなくなり、属性にアクセスする際の速度が大幅に向上しました (GH 17210)

  • 値を具体化しないことで、set_categories() のパフォーマンスが向上しました (GH 17508)

  • Timestamp.microsecond は属性アクセス時に再計算されなくなりました (GH 17331)

  • すでに categorical dtype のデータに対する CategoricalIndex のパフォーマンスが向上しました (GH 17513)

  • RangeIndex.min() および RangeIndex.max() のパフォーマンスが、RangeIndex プロパティを使用して計算を実行することで向上しました (GH 17607)

ドキュメントの変更#

  • いくつかの NaT メソッドの docstring (例: NaT.ctime()) が誤っていました (GH 17327)

  • ドキュメントから v0.17 より前のバージョンへの参照が削除され、整理されました (GH 17442GH 17442GH 17404 & GH 17504)

バグ修正#

変換#

  • int を使用した datetime-like データへの代入バグにより、datetime-like に誤って変換される可能性がありました (GH 14145)

  • int64 データに対する np.ndarray (dtypeが float64) による代入で、int64 dtype が維持される場合があるバグ (GH 14001)。

  • IntervalIndex.is_non_overlapping_monotonic の戻り値の型を、類似の属性/メソッドとの整合性のため、Python の bool に修正しました。以前は numpy.bool_ を返していました。 (GH 17237)

  • 区間が両側で閉じられていて、ある点で重なっている場合の IntervalIndex.is_non_overlapping_monotonic のバグを修正しました (GH 16560)

  • Series.fillna() のバグで、inplace=True かつ value が辞書の場合にフレームを返していました (GH 16156)

  • タイムゾーンにローカライズされた Timestamp.weekday_name が UTC ベースの曜日名を返していたバグを修正しました (GH 17354)

  • DST 変更時に tzinfo を置き換える場合の Timestamp.replace のバグを修正しました (GH 15683)

  • Timedelta の構築と算術演算におけるバグで、Overflow 例外が伝播されませんでした (GH 17367)

  • astype() が、インスタンスではなく拡張型クラス (DatetimeTZDtypeCategoricalDtype) を渡された場合に、object dtype に変換していたバグを修正しました。クラスが渡された場合は TypeError が発生するようになりました (GH 17780)。

  • to_numeric() のバグで、errors='coerce' の場合に要素が常に数値に強制変換されていませんでした (GH 17007GH 17125)

  • DataFrame および Series コンストラクタのバグで、range オブジェクトが Windows では int64 ではなく int32 dtype に変換されていました (GH 16804)

インデックス付け#

  • ヌルスライス (例: df.iloc[:]) で呼び出された場合、.iloc および .loc インデクサは元のオブジェクトのシャローコピーを返します。以前は元のオブジェクトを返していました。 (GH 13873)。

  • ソートされていない MultiIndex で呼び出された場合、loc インデクサは、ソートされていないレベルで適切なスライスが使用された場合にのみ UnsortedIndexError を発生させるようになりました (GH 16734)。

  • 0.20.3 のリグレッションを修正しました。TimedeltaIndex で文字列を使用してインデックス付けした場合のバグを修正しました (GH 16896)。

  • TimedeltaIndex.get_loc()np.timedelta64 入力を処理する方法を修正しました (GH 16909)。

  • MultiIndex.sort_index() の順序付けが、ascending 引数がリストであるが、すべてのレベルが指定されていないか、異なる順序である場合に修正されました (GH 16934)。

  • np.inf でインデックス付けすると OverflowError が発生するバグを修正しました (GH 16957)

  • 空の CategoricalIndex で再インデックス付けする際のバグを修正しました (GH 16770)

  • アラインメントとタイムゾーンを認識する DatetimeIndex を使用して設定する場合の DataFrame.loc を修正しました (GH 16889)

  • 古い numpy で Index または Series を .iloc に渡すと IndexError が発生するのを回避しました (GH 17193)

  • Python 2 での多レベル列のユニコード空文字列をプレースホルダーとして許可しました (GH 17099)

  • .iloc のバグで、インプレース加算または代入と MultiIndex 上の int インデクサを使用した場合に、間違ったインデックスが読み書きされていました (GH 17148)

  • .isin() のバグで、空の Series オブジェクトのメンバーシップをチェックするとエラーが発生していました (GH 16991)

  • CategoricalIndex の再インデックス付けのバグで、重複を含む指定されたインデックスが尊重されていませんでした (GH 17323)

  • 負のステップを持つ RangeIndex の交差のバグを修正しました (GH 17296)

  • IntervalIndex のバグで、重複しない単調減少インデックスの含まれる右端点のスカラールックアップが失敗していました (GH 16417GH 17271)

  • 有効なエントリがない場合の DataFrame.first_valid_index() および DataFrame.last_valid_index() のバグを修正しました (GH 17400)

  • 呼び出し可能オブジェクトで呼び出された場合の Series.rename() のバグで、Index の名前ではなく、Series の名前を誤って変更していました。 (GH 17407)

  • String.str_get() のバグで、負のインデックスを使用した場合に NaN を挿入する代わりに IndexError を発生させていました。 (GH 17704)

IO#

  • read_hdf() のバグで、fixed 形式の HDFStore からタイムゾーンを認識するインデックスを読み取る際にエラーが発生していました (GH 17618)

  • read_csv() のバグで、列が完全に重複排除されていませんでした (GH 17060)

  • read_csv() のバグで、指定された列名が完全に重複排除されていませんでした (GH 17095)

  • read_csv() のバグで、ヘッダー引数に非整数値が指定された場合に、役に立たない/無関係なエラーメッセージが生成されていました (GH 16338)

  • read_csv() のバグで、例外処理におけるメモリ管理の問題により、特定の条件下でインタープリタがセグメンテーション違反を起こしていました (GH 14696GH 16798)。

  • read_csv() のバグで、low_memory=False で呼び出された場合に、サイズが 2GB を超える列が少なくとも 1 つある CSV で誤って MemoryError が発生していました (GH 16798)。

  • read_csv() のバグで、単一要素リスト header で呼び出された場合に、すべての NaN 値を持つ DataFrame が返されていました (GH 7757)

  • DataFrame.to_csv() のバグで、Python 3 で 'utf-8' ではなく 'ascii' エンコーディングがデフォルトになっていました (GH 17097)

  • read_stata() のバグで、イテレータを使用している場合に値ラベルを読み取ることができませんでした (GH 16923)

  • read_stata() のバグで、インデックスが設定されていませんでした (GH 16342)

  • read_html() のバグで、複数のスレッドで実行された場合にインポートチェックが失敗していました (GH 16928)

  • read_csv() のバグで、自動区切り文字検出により、不正な行が検出された場合に正しいエラーメッセージではなく TypeError がスローされていました (GH 13374)

  • DataFrame.to_html()notebook=True のバグで、名前付きインデックスまたは非 MultiIndex インデックスを持つ DataFrame が、それぞれ列または行ラベルの不適切な水平方向または垂直方向の配置になっていました (GH 16792)

  • DataFrame.to_html() のバグで、justify パラメータの検証がありませんでした (GH 17527)

  • HDFStore.select() のバグで、VLArray を含む連続した混合データテーブルを読み取る際にエラーが発生していました (GH 17021)

  • to_json() のバグで、いくつかの条件 (印刷できない記号を持つオブジェクト、深い再帰を持つオブジェクト、長すぎるラベルなど) が、適切な例外を発生させる代わりにセグメンテーション違反を引き起こしていました (GH 14256)

プロット#

  • secondary_yfontsize を使用するプロットメソッドのバグで、二次軸のフォントサイズが設定されていませんでした (GH 12565)

  • y軸に timedeltadatetime dtypes をプロットする際のバグを修正しました (GH 16953)

  • 線グラフは、xlims を計算する際に単調な x データを仮定しなくなり、ソートされていない x データでも線全体を表示するようになりました。 (GH 11310GH 11471)

  • matplotlib 2.0.0 以降では、線グラフの x 制限の計算は matplotlib に任され、新しいデフォルト設定が適用されるようになりました。 (GH 15495)

  • Series.plot.bar または DataFrame.plot.bary がユーザーが渡した color を尊重しないバグを修正しました (GH 16822)

  • ランダムな色を使用する際に plotting.parallel_coordinates がランダムシードをリセットするバグを修正しました (GH 17525)

GroupBy/resample/rolling#

  • DataFrame.resample(...).size() のバグで、空の DataFrameSeries を返しませんでした (GH 14962)

  • infer_freq() のバグで、営業週中に2日間のギャップがあるインデックスがビジネスデイと誤って推論されていました (GH 16624)

  • .rolling(...).quantile() のバグで、Series.quantile() および DataFrame.quantile() と異なるデフォルトが誤って使用されていました (GH 9413GH 16211)

  • groupby.transform() のバグで、ブール型 dtypes が float に強制変換されていました (GH 16875)

  • Series.resample(...).apply() のバグで、空の Series がソースインデックスを変更し、Series の名前を返しませんでした (GH 14313)

  • .rolling(...).apply(...) のバグで、DatetimeIndex を持つ DataFrame、timedelta に変換可能な window、および min_periods >= 1 の場合にエラーが発生していました (GH 15305)

  • DataFrame.groupby のバグで、キーの数が groupby 軸の要素の数と等しい場合に、インデックスと列のキーが正しく認識されませんでした (GH 16859)

  • TimeGrouperNaT を正しく処理できない groupby.nunique() のバグを修正しました (GH 17575)

  • DataFrame.groupby のバグで、MultiIndex から単一レベルを選択した場合に予期せずソートされていました (GH 17537)

  • DataFrame.groupby のバグで、曖昧な列名を上書きするために Grouper オブジェクトが使用された場合に誤った警告が発生していました (GH 17383)

  • TimeGrouper がリストとして渡された場合とスカラとして渡された場合で異なるバグを修正しました (GH 17530)

スパース#

  • SparseSeries のバグで、辞書がデータとして渡された場合に AttributeError を発生させていました (GH 16905)

  • SparseDataFrame.fillna() のバグで、SciPy 疎行列からインスタンス化されたフレームのすべての NaN を埋めていませんでした (GH 16112)

  • SparseSeries.unstack() および SparseDataFrame.stack() のバグを修正しました (GH 16614GH 15045)

  • make_sparse() のバグで、配列の dtypeobject の場合に、同じビットを持つ2つの数値/ブールデータを同じものとして扱っていました (GH 17574)

  • SparseArray.all()SparseArray.any()SparseArray を処理するように実装されました。これらは使用されていましたが実装されていませんでした (GH 17570)

再整形#

  • 一意でない PeriodIndex と結合/マージすると TypeError が発生していました (GH 16871)

  • crosstab() のバグで、アラインメントされていない整数のシリーズが浮動小数点数にキャストされていました (GH 17005)

  • datetime-like のブール/int データ型を持つ categorical dtypes とのマージのバグで、誤って TypeError が発生していました (GH 16900)

  • 大きなオブジェクトシリーズと大きな比較配列で isin() を使用する際のバグを修正しました (GH 16012)

  • 0.20 からのリグレッションを修正しました。Series.aggregate() および DataFrame.aggregate() は、辞書を戻り値として再び許可するようになりました (GH 16741)

  • margins=True で呼び出された場合の pivot_table() からの、整数 dtype 入力での結果の dtype を修正しました (GH 17013)

  • crosstab() のバグで、同じ名前の2つの Series を渡すと KeyError が発生していました (GH 13279)

  • Series.argmin()Series.argmax()、および DataFrame と groupby オブジェクトの対応するメソッドは、無限値を含む浮動小数点データで正しく動作するようになりました (GH 13595)。

  • unique() のバグで、文字列のタプルをチェックすると TypeError が発生していました (GH 17108)

  • concat() のバグで、結果のインデックスに比較できない要素が含まれている場合に、順序が予測不能でした (GH 17344)

  • datetime64 dtype の SeriesNaT 値を持つ複数の列でソートする際のリグレッションを修正しました (GH 16836)

  • pivot_table() のバグで、dropnaFalse の場合に、結果の列が columns のカテゴリカル dtype を保持しませんでした (GH 17842)

  • DataFrame.drop_duplicates のバグで、一意でない列名で削除すると ValueError が発生していました (GH 17836)

  • レベルのリストで呼び出された場合に fillna 引数を破棄する unstack() のバグを修正しました (GH 13971)

  • range オブジェクトとその他のリストライクオブジェクトが DataFrame とアラインメントされる際のバグで、操作が列方向ではなく行方向で実行されていました (GH 17901)

数値#

  • .clip() のバグで、axis=1 とリストライクな threshold が渡された場合に、以前は ValueError が発生していました (GH 15390)

  • Series.clip() および DataFrame.clip() は、上下限引数の NA 値を None として扱うようになり、ValueError を発生させなくなりました (GH 17276)。

カテゴリカル#

  • カテゴリカルで呼び出された場合の Series.isin() のバグを修正しました (GH 16639)

  • 空の値とカテゴリを持つカテゴリカルコンストラクタのバグで、.categories が object dtype の空の Index ではなく、空の Float64Index になっていました (GH 17248)

  • Series.cat を使用したカテゴリカル操作のバグで、元の Series の名前が保持されていませんでした (GH 17509)

  • ブール/int データ型を持つカテゴリカル列の DataFrame.merge() が失敗するバグを修正しました (GH 17187)

  • 指定された categories がカテゴリカル型である場合の Categorical/CategoricalDtype の構築のバグを修正しました (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)

その他#

  • いくつかのインプレース演算子がラップされておらず、呼び出されたときにコピーを生成するバグを修正しました (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 +

  • ギルヘルム・ベルトラミーニ

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

  • ケビン・シェパード

  • 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

  • ピエトロ・バティストン

  • Pradyumna Reddy Chinthala

  • Prasanjit Prakash

  • RobinFiveWords

  • Ryan Hendrickson

  • Sam Foo

  • Sangwoong Yoon +

  • Simon Gibbons +

  • SimonBaron

  • Steven Cutting +

  • Sudeep +

  • Sylvia +

  • T N +

  • Telt

  • トーマス・A・キャスウェル

  • 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

  • クリス・B1

  • dkamm +

  • dwkenefick

  • economy

  • faic +

  • fding253 +

  • ジーエフヤング

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