バージョン 0.21.0 (2017年10月27日)#
これは0.20.3からのメジャーリリースであり、多数のAPI変更、非推奨、新機能、機能強化、パフォーマンス改善、そして多数のバグ修正が含まれています。すべてのユーザーにこのバージョンへのアップグレードをお勧めします。
主な機能は以下の通りです。
Apache Parquet との統合。これには、新しいトップレベルの
read_parquet()関数とDataFrame.to_parquet()メソッドが含まれます。詳細はこちらを参照してください。データから独立してカテゴリカルを指定するための新しいユーザー向け
pandas.api.types.CategoricalDtype。詳細はこちらを参照してください。すべてのNaNのSeries/DataFrameに対する
sumとprodの挙動が統一され、bottleneck がインストールされているかどうかに依存しなくなりました。また、空のSeriesに対するsumとprodは0ではなくNaNを返すようになりました。詳細はこちらを参照してください。pypyの互換性修正。詳細はこちらを参照してください。
drop、reindex、renameのAPIに追加が加えられ、より一貫性のあるものになりました。詳細はこちらを参照してください。新しいメソッド
DataFrame.infer_objects(詳細はこちら) とGroupBy.pipe(詳細はこちら) の追加。ラベルのリストを使ったインデックス付けで、1つ以上のラベルが欠落している場合が非推奨となり、将来のバージョンではKeyErrorが発生します。詳細はこちらを参照してください。
v0.21.0の新機能
新機能#
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]
メソッド 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
[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')
値は正しく整数として解釈されました。
Categorical、CategoricalIndex、またはカテゴリ型を持つ 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_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_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.HDFStore、pd.ExcelFile、およびpd.ExcelWriterに__fspath__メソッドが追加され、ファイルシステムパスプロトコルと適切に連携するようになりました (GH 13823)。merge()のvalidate引数が、マージが一対一、一対多、多対一、または多対多であるかどうかをチェックするようになりました。指定されたマージタイプに該当しないマージが見つかった場合、MergeError型の例外が生成されます。詳細については、こちらを参照してください (GH 16270)。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、またはすべての 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
ボトルネックのインストールに関係なく、新しい動作
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() という追加のメソッドが含まれています。これらは 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 に対して特定のイテレーションメソッドを使用すると、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 アップサンプリングは、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 [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
単一レベルを持つ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つは、start、end、period のすべてのパラメータが指定された場合に発生し、曖昧な範囲につながる可能性がありました。これら3つのパラメータすべてが渡された場合、interval_range は period パラメータを無視し、period_range は end パラメータを無視し、他の範囲関数は例外を発生させました。範囲関数間の一貫性を促進し、曖昧な範囲の可能性を避けるために、interval_range と period_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
さらに、エンドポイントパラメータ end は interval_range によって生成された区間には含まれていませんでした。しかし、他のすべての範囲関数は出力に end を含んでいます。範囲関数間の一貫性を促進するために、interval_range は、freq が end をスキップする方法で指定されていない限り、最終区間の右端点として 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に date、time、datetime、datetime64、および Period コンバーターを自動的に登録しなくなりました。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で存在しない属性にアクセスすると、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()は、objectdtypes とともに使用された場合、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()において、非機能的な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()は、.to_excel()との整合性のため、sheetnameをsheet_nameに変更しました (GH 10559)。read_excel()は、read_csv()との整合性のため、parse_colsをusecolsに変更しました (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.borderはpd.options.display.html.borderに変更されました (GH 15793)。SeriesGroupBy.nth()は、dropnakwarg のTrueを'all'に変更しました (GH 11038)。DataFrame.as_blocks()は内部実装を公開しているため非推奨になりました (GH 17302)pd.TimeGrouperはpandas.Grouperに変更されました (GH 16747)cdate_rangeは、カスタム頻度の日付範囲を構築するためにweekmaskおよびholidaysパラメータを取得したbdate_range()に変更されました。詳細についてはドキュメントを参照してください (GH 17596)Series.astype()にcategoriesまたはorderedkwarg を渡すことは非推奨になりました。CategoricalDtype を渡すようにしてください (GH 17636)Series、DataFrame、Panel、SparseSeries、および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.Series は argmax および argmin を実装しています。pandas 0.13.0 以降、argmax は pandas.Series.idxmax() のエイリアスであり、argmin は pandas.Series.idxmin() のエイリアスです。これらは*位置*ではなく、最大値または最小値の*ラベル*を返します。
Series.argmax および Series.argmin の現在の動作は非推奨になりました。これらを使用すると FutureWarning が発生します。最大値のラベルが必要な場合は Series.idxmax() を使用してください。最大値の位置が必要な場合は Series.values.argmax() を使用してください。最小値についても同様です。将来のリリースでは、Series.argmax および Series.argmin は最大値または最小値の位置を返します。
以前のバージョンの非推奨/変更の削除#
read_excel()はhas_index_namesパラメータを削除しました (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)値を具体化しないことで、
set_categories()のパフォーマンスが向上しました (GH 17508)Timestamp.microsecondは属性アクセス時に再計算されなくなりました (GH 17331)すでに categorical dtype のデータに対する
CategoricalIndexのパフォーマンスが向上しました (GH 17513)RangeIndex.min()およびRangeIndex.max()のパフォーマンスが、RangeIndexプロパティを使用して計算を実行することで向上しました (GH 17607)
ドキュメントの変更#
バグ修正#
変換#
intを使用した datetime-like データへの代入バグにより、datetime-like に誤って変換される可能性がありました (GH 14145)int64データに対するnp.ndarray(dtypeがfloat64) による代入で、int64dtype が維持される場合があるバグ (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()が、インスタンスではなく拡張型クラス (DatetimeTZDtype、CategoricalDtype) を渡された場合に、object dtype に変換していたバグを修正しました。クラスが渡された場合はTypeErrorが発生するようになりました (GH 17780)。to_numeric()のバグで、errors='coerce'の場合に要素が常に数値に強制変換されていませんでした (GH 17007、GH 17125)DataFrameおよびSeriesコンストラクタのバグで、rangeオブジェクトが Windows ではint64ではなくint32dtype に変換されていました (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 16417、GH 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 14696、GH 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_yとfontsizeを使用するプロットメソッドのバグで、二次軸のフォントサイズが設定されていませんでした (GH 12565)y軸に
timedeltaとdatetimedtypes をプロットする際のバグを修正しました (GH 16953)線グラフは、xlims を計算する際に単調な x データを仮定しなくなり、ソートされていない x データでも線全体を表示するようになりました。 (GH 11310、GH 11471)
matplotlib 2.0.0 以降では、線グラフの x 制限の計算は matplotlib に任され、新しいデフォルト設定が適用されるようになりました。 (GH 15495)
Series.plot.barまたはDataFrame.plot.barでyがユーザーが渡したcolorを尊重しないバグを修正しました (GH 16822)ランダムな色を使用する際に
plotting.parallel_coordinatesがランダムシードをリセットするバグを修正しました (GH 17525)
GroupBy/resample/rolling#
DataFrame.resample(...).size()のバグで、空のDataFrameがSeriesを返しませんでした (GH 14962)infer_freq()のバグで、営業週中に2日間のギャップがあるインデックスがビジネスデイと誤って推論されていました (GH 16624).rolling(...).quantile()のバグで、Series.quantile()およびDataFrame.quantile()と異なるデフォルトが誤って使用されていました (GH 9413、GH 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)TimeGrouperがNaTを正しく処理できない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 16614、GH 15045)make_sparse()のバグで、配列のdtypeがobjectの場合に、同じビットを持つ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)datetime64dtype のSeriesでNaT値を持つ複数の列でソートする際のリグレッションを修正しました (GH 16836)pivot_table()のバグで、dropnaがFalseの場合に、結果の列が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)
その他#
貢献者#
このリリースには合計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 +