バージョン 0.18.1 (2016年5月3日)#
これは0.18.0からのマイナーなバグ修正リリースであり、多数のバグ修正に加え、いくつかの新機能、機能強化、パフォーマンス改善が含まれています。すべてのユーザーにこのバージョンへのアップグレードを推奨します。
主な機能は以下の通りです。
.groupby(...)は、グループごとの.rolling(..)、.expanding(..)、.resample(..)との連携を便利にする構文を提供するために強化されました。詳細はこちらを参照してください。pd.to_datetime()はDataFrameから日付を組み立てる機能を得ました。詳細はこちらを参照してください。メソッドチェーンの改善については、こちらを参照してください。
カスタム営業時間オフセットについては、こちらを参照してください。
sparseの処理における多くのバグ修正については、こちらを参照してください。チュートリアルセクションを、@TomAugsburger氏によるモダンなpandasの機能に関する記事で拡張しました。(GH 13045)
v0.18.1の新機能
新機能#
カスタム営業時間#
CustomBusinessHourはBusinessHourとCustomBusinessDayを組み合わせたもので、任意の休日を指定できます。詳細については、カスタム営業時間を参照してください。(GH 11514)
In [1]: from pandas.tseries.offsets import CustomBusinessHour
In [2]: from pandas.tseries.holiday import USFederalHolidayCalendar
In [3]: bhour_us = CustomBusinessHour(calendar=USFederalHolidayCalendar())
MLKの日の前の金曜日
In [4]: import datetime
In [5]: dt = datetime.datetime(2014, 1, 17, 15)
In [6]: dt + bhour_us
Out[6]: Timestamp('2014-01-17 16:00:00')
MLKの日の後の火曜日(月曜日は祝日のためスキップされます)
In [7]: dt + bhour_us * 2
Out[7]: Timestamp('2014-01-20 09:00:00')
ウィンドウおよびリサンプル操作を伴う.groupby(..)構文#
.groupby(...)は、グループごとの.rolling(..)、.expanding(..)、.resample(..)との連携を便利にする構文を提供するために強化されました。詳細は(GH 12486、GH 12738)を参照してください。
これで、グループ化されたデータに対して.rolling(..)と.expanding(..)をメソッドとして使用できます。これらは(グループ化されていないpandasオブジェクトに対して.rolling()と.expanding()が行うのと同様に)別の遅延オブジェクトを返します。その後、これらのRollingGroupbyオブジェクトに対して同様に操作できます。
以前は、グループごとに移動ウィンドウ平均を取得するには、次のようにする必要がありました。
In [8]: df = pd.DataFrame({"A": [1] * 20 + [2] * 12 + [3] * 8, "B": np.arange(40)})
In [9]: df
Out[9]:
A B
0 1 0
1 1 1
2 1 2
3 1 3
4 1 4
.. .. ..
35 3 35
36 3 36
37 3 37
38 3 38
39 3 39
[40 rows x 2 columns]
In [1]: df.groupby("A").apply(lambda x: x.rolling(4).B.mean())
Out[1]:
A
1 0 NaN
1 NaN
2 NaN
3 1.5
4 2.5
5 3.5
6 4.5
7 5.5
8 6.5
9 7.5
10 8.5
11 9.5
12 10.5
13 11.5
14 12.5
15 13.5
16 14.5
17 15.5
18 16.5
19 17.5
2 20 NaN
21 NaN
22 NaN
23 21.5
24 22.5
25 23.5
26 24.5
27 25.5
28 26.5
29 27.5
30 28.5
31 29.5
3 32 NaN
33 NaN
34 NaN
35 33.5
36 34.5
37 35.5
38 36.5
39 37.5
Name: B, dtype: float64
これで次のようにできます。
In [10]: df.groupby("A").rolling(4).B.mean()
Out[10]:
A
1 0 NaN
1 NaN
2 NaN
3 1.5
4 2.5
...
3 35 33.5
36 34.5
37 35.5
38 36.5
39 37.5
Name: B, Length: 40, dtype: float64
.resample(..)型の操作の場合、以前は次のようにする必要がありました。
In [11]: df = pd.DataFrame(
....: {
....: "date": pd.date_range(start="2016-01-01", periods=4, freq="W"),
....: "group": [1, 1, 2, 2],
....: "val": [5, 6, 7, 8],
....: }
....: ).set_index("date")
....:
In [12]: df
Out[12]:
group val
date
2016-01-03 1 5
2016-01-10 1 6
2016-01-17 2 7
2016-01-24 2 8
[4 rows x 2 columns]
In[1]: df.groupby("group").apply(lambda x: x.resample("1D").ffill())
Out[1]:
group val
group date
1 2016-01-03 1 5
2016-01-04 1 5
2016-01-05 1 5
2016-01-06 1 5
2016-01-07 1 5
2016-01-08 1 5
2016-01-09 1 5
2016-01-10 1 6
2 2016-01-17 2 7
2016-01-18 2 7
2016-01-19 2 7
2016-01-20 2 7
2016-01-21 2 7
2016-01-22 2 7
2016-01-23 2 7
2016-01-24 2 8
これで次のようにできます。
In[1]: df.groupby("group").resample("1D").ffill()
Out[1]:
group val
group date
1 2016-01-03 1 5
2016-01-04 1 5
2016-01-05 1 5
2016-01-06 1 5
2016-01-07 1 5
2016-01-08 1 5
2016-01-09 1 5
2016-01-10 1 6
2 2016-01-17 2 7
2016-01-18 2 7
2016-01-19 2 7
2016-01-20 2 7
2016-01-21 2 7
2016-01-22 2 7
2016-01-23 2 7
2016-01-24 2 8
メソッドチェーンの改善#
以下のメソッド/インデクサーはcallableを受け入れるようになりました。これはメソッドチェーンでの利用をより便利にすることを目的としています。詳細はドキュメントを参照してください。(GH 11485、GH 12533)
.where()および.mask().loc[]、iloc[]および.ix[][]インデックス付け
メソッド.where()および.mask()#
これらは条件およびother引数に対して呼び出し可能オブジェクトを受け入れることができます。
In [13]: df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})
In [14]: df.where(lambda x: x > 4, lambda x: x + 10)
Out[14]:
A B C
0 11 14 7
1 12 5 8
2 13 6 9
[3 rows x 3 columns]
メソッド.loc[]、.iloc[]、.ix[]#
これらは呼び出し可能オブジェクトと、スライサーとしての呼び出し可能オブジェクトのタプルを受け入れることができます。呼び出し可能オブジェクトは、これらのインデクサーの入力として有効なブールインデクサーまたはその他の有効なものを返すことができます。
# callable returns bool indexer
In [15]: df.loc[lambda x: x.A >= 2, lambda x: x.sum() > 10]
Out[15]:
B C
1 5 8
2 6 9
[2 rows x 2 columns]
# callable returns list of labels
In [16]: df.loc[lambda x: [1, 2], lambda x: ["A", "B"]]
Out[16]:
A B
1 2 5
2 3 6
[2 rows x 2 columns]
[]によるインデックス付け#
最後に、Series、DataFrame、Panelの[]インデックス付けで呼び出し可能オブジェクトを使用できます。呼び出し可能オブジェクトは、そのクラスとインデックス型に応じて、[]インデックス付けの有効な入力を返す必要があります。
In [17]: df[lambda x: "A"]
Out[17]:
0 1
1 2
2 3
Name: A, Length: 3, dtype: int64
これらのメソッド/インデクサーを使用すると、一時変数を使用せずにデータ選択操作をチェーンできます。
In [18]: bb = pd.read_csv("data/baseball.csv", index_col="id")
In [19]: (bb.groupby(["year", "team"]).sum(numeric_only=True).loc[lambda df: df.r > 100])
Out[19]:
stint g ab r h X2b ... so ibb hbp sh sf gidp
year team ...
2007 CIN 6 379 745 101 203 35 ... 127.0 14.0 1.0 1.0 15.0 18.0
DET 5 301 1062 162 283 54 ... 176.0 3.0 10.0 4.0 8.0 28.0
HOU 4 311 926 109 218 47 ... 212.0 3.0 9.0 16.0 6.0 17.0
LAN 11 413 1021 153 293 61 ... 141.0 8.0 9.0 3.0 8.0 29.0
NYN 13 622 1854 240 509 101 ... 310.0 24.0 23.0 18.0 15.0 48.0
SFN 5 482 1305 198 337 67 ... 188.0 51.0 8.0 16.0 6.0 41.0
TEX 2 198 729 115 200 40 ... 140.0 4.0 5.0 2.0 8.0 16.0
TOR 4 459 1408 187 378 96 ... 265.0 16.0 12.0 4.0 16.0 38.0
[8 rows x 18 columns]
MultiIndexの一部である場合のDatetimeIndexの部分文字列インデックス付け#
MultiIndexの一部である場合、部分文字列インデックス付けがDateTimeIndexに一致するようになりました。(GH 10331)
In [20]: dft2 = pd.DataFrame(
....: np.random.randn(20, 1),
....: columns=["A"],
....: index=pd.MultiIndex.from_product(
....: [pd.date_range("20130101", periods=10, freq="12H"), ["a", "b"]]
....: ),
....: )
....:
In [21]: dft2
Out[21]:
A
2013-01-01 00:00:00 a 0.469112
b -0.282863
2013-01-01 12:00:00 a -1.509059
b -1.135632
2013-01-02 00:00:00 a 1.212112
... ...
2013-01-04 12:00:00 b 0.271860
2013-01-05 00:00:00 a -0.424972
b 0.567020
2013-01-05 12:00:00 a 0.276232
b -1.087401
[20 rows x 1 columns]
In [22]: dft2.loc["2013-01-05"]
Out[22]:
A
2013-01-05 00:00:00 a -0.424972
b 0.567020
2013-01-05 12:00:00 a 0.276232
b -1.087401
[4 rows x 1 columns]
他のレベルでは
In [26]: idx = pd.IndexSlice
In [27]: dft2 = dft2.swaplevel(0, 1).sort_index()
In [28]: dft2
Out[28]:
A
a 2013-01-01 00:00:00 0.469112
2013-01-01 12:00:00 -1.509059
2013-01-02 00:00:00 1.212112
2013-01-02 12:00:00 0.119209
2013-01-03 00:00:00 -0.861849
... ...
b 2013-01-03 12:00:00 1.071804
2013-01-04 00:00:00 -0.706771
2013-01-04 12:00:00 0.271860
2013-01-05 00:00:00 0.567020
2013-01-05 12:00:00 -1.087401
[20 rows x 1 columns]
In [29]: dft2.loc[idx[:, "2013-01-05"], :]
Out[29]:
A
a 2013-01-05 00:00:00 -0.424972
2013-01-05 12:00:00 0.276232
b 2013-01-05 00:00:00 0.567020
2013-01-05 12:00:00 -1.087401
[4 rows x 1 columns]
日時を組み立てる#
pd.to_datetime()は、渡されたDataFrameまたは辞書から日時を組み立てる機能を得ました。(GH 8158)
In [20]: df = pd.DataFrame(
....: {"year": [2015, 2016], "month": [2, 3], "day": [4, 5], "hour": [2, 3]}
....: )
....:
In [21]: df
Out[21]:
year month day hour
0 2015 2 4 2
1 2016 3 5 3
[2 rows x 4 columns]
渡されたフレームを使用して組み立てる。
In [22]: pd.to_datetime(df)
Out[22]:
0 2015-02-04 02:00:00
1 2016-03-05 03:00:00
Length: 2, dtype: datetime64[ns]
組み立てるのに必要な列のみを渡すことができます。
In [23]: pd.to_datetime(df[["year", "month", "day"]])
Out[23]:
0 2015-02-04
1 2016-03-05
Length: 2, dtype: datetime64[ns]
その他の機能強化#
pd.read_csv()はPythonエンジンでdelim_whitespace=Trueをサポートするようになりました。(GH 12958)pd.read_csv()は、拡張子推論または明示的なcompression='zip'により、単一のCSVを含むZIPファイルを開くことをサポートするようになりました。(GH 12175)pd.read_csv()は、拡張子推論または明示的なcompression='xz'を指定することにより、xz圧縮を使用したファイルを開くことをサポートするようになりました。xz圧縮はDataFrame.to_csvでも同様にサポートされています。(GH 11852)pd.read_msgpack()は、圧縮が使用されている場合でも、常に書き込み可能なndarrayを返すようになりました。(GH 12359)pd.read_msgpack()は、msgpackでのカテゴリのシリアル化とデシリアル化をサポートするようになりました。(GH 12573).to_json()は、カテゴリデータとスパースデータを含むNDFramesをサポートするようになりました。(GH 10778)interpolate()はmethod='akima'をサポートするようになりました。(GH 7588)pd.read_excel()は、他のread_*関数と同様に、ファイルパスにパスオブジェクト(例:pathlib.Path、py.path.local)を受け入れるようになりました。(GH 12655).weekday_nameプロパティがDatetimeIndexおよび.dtアクセサーのコンポーネントとして追加されました。(GH 11128)Index.takeは、allow_fillとfill_valueを一貫して処理するようになりました。(GH 12631)In [24]: idx = pd.Index([1.0, 2.0, 3.0, 4.0], dtype="float") # default, allow_fill=True, fill_value=None In [25]: idx.take([2, -1]) Out[25]: Index([3.0, 4.0], dtype='float64') In [26]: idx.take([2, -1], fill_value=True) Out[26]: Index([3.0, nan], dtype='float64')
IndexはMultiIndexを返す.str.get_dummies()をサポートするようになりました。詳細はインジケーター変数の作成を参照してください。(GH 10008、GH 10103)In [27]: idx = pd.Index(["a|b", "a|c", "b|c"]) In [28]: idx.str.get_dummies("|") Out[28]: MultiIndex([(1, 1, 0), (1, 0, 1), (0, 1, 1)], names=['a', 'b', 'c'])
pd.crosstab()は、頻度テーブルを正規化するためのnormalize引数を追加しました。(GH 12569)。更新されたドキュメントの例はこちらです。.resample(..).interpolate()がサポートされるようになりました。(GH 12925).isin()は渡されたsetsを受け入れるようになりました。(GH 12988)
スパースの変更点#
これらの変更により、スパース処理は正しい型を返すように適合し、インデックス付けの作業をよりスムーズにするように機能します。
SparseArray.takeは、スカラ入力の場合はスカラを返し、それ以外の場合はSparseArrayを返すようになりました。さらに、Indexと同じルールで負のインデクサーを処理します。(GH 10560、GH 12796)
s = pd.SparseArray([np.nan, np.nan, 1, 2, 3, np.nan, 4, 5, np.nan, 6])
s.take(0)
s.take([1, 2, 3])
Ellipsisを使用したSparseSeries[]インデックス付けのバグでKeyErrorが発生します。(GH 9467)タプルを使用した
SparseArray[]インデックス付けのバグが正しく処理されない。(GH 12966)リストのような入力を持つ
SparseSeries.loc[]のバグでTypeErrorが発生します。(GH 10560)スカラ入力を持つ
SparseSeries.iloc[]のバグでIndexErrorが発生する可能性があります。(GH 10560)sliceを持つSparseSeries.loc[]、.iloc[]のバグでSparseSeriesではなくSparseArrayが返される。(GH 10560)SparseDataFrame.loc[]、.iloc[]のバグでSparseSeriesではなく密なSeriesになる可能性があります。(GH 12787)SparseArrayの加算が右辺のfill_valueを無視するバグ。(GH 12910)SparseArrayの剰余がAttributeErrorを発生させるバグ。(GH 12910)SparseArrayの累乗が1 ** np.nanをnp.nanとして計算するバグ、これは1であるべきです。(GH 12910)SparseArrayの比較出力が誤った結果になるか、ValueErrorを発生させるバグ。(GH 12971)SparseSeries.__repr__がmax_rowsより長い場合にTypeErrorを発生させるバグ。(GH 10560)SparseSeries.shapeがfill_valueを無視するバグ。(GH 10452)SparseSeriesとSparseArrayがその密な値と異なるdtypeを持つ可能性があるバグ。(GH 12908)SparseSeries.reindexがfill_valueを不正確に処理するバグ。(GH 12797)SparseArray.to_frame()がSparseDataFrameではなくDataFrameを返すバグ。(GH 9850)SparseSeries.value_counts()がfill_valueをカウントしないバグ。(GH 6749)SparseArray.to_dense()がdtypeを保持しないバグ。(GH 10648)SparseArray.to_dense()がfill_valueを不正確に処理するバグ。(GH 12797)SparseSeriesのpd.concat()が密になるバグ。(GH 10536)SparseDataFrameのpd.concat()がfill_valueを不正確に処理するバグ。(GH 9765)SparseDataFrameのpd.concat()がAttributeErrorを発生させる可能性のあるバグ。(GH 12174)SparseArray.shift()がNameErrorまたはTypeErrorを発生させる可能性のあるバグ。(GH 12908)
APIの変更点#
メソッド.groupby(..).nth()の変更#
.groupby(..).nth()の出力におけるインデックスが、as_index引数が渡されたときに、より一貫性を持つようになりました。(GH 11039)
In [29]: df = pd.DataFrame({"A": ["a", "b", "a"], "B": [1, 2, 3]})
In [30]: df
Out[30]:
A B
0 a 1
1 b 2
2 a 3
[3 rows x 2 columns]
以前の動作
In [3]: df.groupby('A', as_index=True)['B'].nth(0)
Out[3]:
0 1
1 2
Name: B, dtype: int64
In [4]: df.groupby('A', as_index=False)['B'].nth(0)
Out[4]:
0 1
1 2
Name: B, dtype: int64
新しい動作
In [31]: df.groupby("A", as_index=True)["B"].nth(0)
Out[31]:
0 1
1 2
Name: B, Length: 2, dtype: int64
In [32]: df.groupby("A", as_index=False)["B"].nth(0)
Out[32]:
0 1
1 2
Name: B, Length: 2, dtype: int64
さらに、以前は.nth()にsort=Falseが渡されても、.groupbyは常にソートしていました。
In [33]: np.random.seed(1234)
In [34]: df = pd.DataFrame(np.random.randn(100, 2), columns=["a", "b"])
In [35]: df["c"] = np.random.randint(0, 4, 100)
以前の動作
In [4]: df.groupby('c', sort=True).nth(1)
Out[4]:
a b
c
0 -0.334077 0.002118
1 0.036142 -2.074978
2 -0.720589 0.887163
3 0.859588 -0.636524
In [5]: df.groupby('c', sort=False).nth(1)
Out[5]:
a b
c
0 -0.334077 0.002118
1 0.036142 -2.074978
2 -0.720589 0.887163
3 0.859588 -0.636524
新しい動作
In [36]: df.groupby("c", sort=True).nth(1)
Out[36]:
a b c
2 -0.720589 0.887163 2
3 0.859588 -0.636524 3
7 -0.334077 0.002118 0
21 0.036142 -2.074978 1
[4 rows x 3 columns]
In [37]: df.groupby("c", sort=False).nth(1)
Out[37]:
a b c
2 -0.720589 0.887163 2
3 0.859588 -0.636524 3
7 -0.334077 0.002118 0
21 0.036142 -2.074978 1
[4 rows x 3 columns]
NumPy関数の互換性#
pandasの配列のようなメソッド(例:sumおよびtake)とそれに対応するnumpyの互換性は、pandasの実装で必ずしも使用されない場合でも、numpyから渡される引数を受け入れるようにpandasメソッドのシグネチャを拡張することで、大幅に向上しました。(GH 12644、GH 12638、GH 12687)
IndexとTimedeltaIndexの.searchsorted()は、numpyのsearchsorted関数との互換性を維持するために、sorter引数を受け入れるようになりました。(GH 12238)Seriesに対するnp.round()のnumpy互換性のバグ。(GH 12600)
このシグネチャ拡張の例を以下に示します。
sp = pd.SparseDataFrame([1, 2, 3])
sp
以前の動作
In [2]: np.cumsum(sp, axis=0)
...
TypeError: cumsum() takes at most 2 arguments (4 given)
新しい動作
np.cumsum(sp, axis=0)
GroupByリサンプリングで.applyを使用する#
リサンプリンググループ化操作(pd.TimeGrouperを使用)に対するapplyの使用は、他のグループ化操作に対する同様のapply呼び出しと同じ出力型を持つようになりました。(GH 11742)
In [38]: df = pd.DataFrame(
....: {"date": pd.to_datetime(["10/10/2000", "11/10/2000"]), "value": [10, 13]}
....: )
....:
In [39]: df
Out[39]:
date value
0 2000-10-10 10
1 2000-11-10 13
[2 rows x 2 columns]
以前の動作
In [1]: df.groupby(pd.TimeGrouper(key='date',
...: freq='M')).apply(lambda x: x.value.sum())
Out[1]:
...
TypeError: cannot concatenate a non-NDFrame object
# Output is a Series
In [2]: df.groupby(pd.TimeGrouper(key='date',
...: freq='M')).apply(lambda x: x[['value']].sum())
Out[2]:
date
2000-10-31 value 10
2000-11-30 value 13
dtype: int64
新しい動作
# Output is a Series
In [55]: df.groupby(pd.TimeGrouper(key='date',
...: freq='M')).apply(lambda x: x.value.sum())
Out[55]:
date
2000-10-31 10
2000-11-30 13
Freq: M, dtype: int64
# Output is a DataFrame
In [56]: df.groupby(pd.TimeGrouper(key='date',
...: freq='M')).apply(lambda x: x[['value']].sum())
Out[56]:
value
date
2000-10-31 10
2000-11-30 13
read_csv例外の変更#
cとpythonの両エンジンでread_csv APIを標準化するために、空の列またはヘッダーに対して、両方ともValueErrorのサブクラスであるEmptyDataErrorを発生させるようになりました。(GH 12493、GH 12506)
以前の動作
In [1]: import io
In [2]: df = pd.read_csv(io.StringIO(''), engine='c')
...
ValueError: No columns to parse from file
In [3]: df = pd.read_csv(io.StringIO(''), engine='python')
...
StopIteration
新しい動作
In [1]: df = pd.read_csv(io.StringIO(''), engine='c')
...
pandas.io.common.EmptyDataError: No columns to parse from file
In [2]: df = pd.read_csv(io.StringIO(''), engine='python')
...
pandas.io.common.EmptyDataError: No columns to parse from file
このエラー変更に加えて、いくつかの他の変更も行われています。
CParserErrorは、単なるExceptionではなく、ValueErrorのサブクラスになりました。(GH 12551)cエンジンが列を解析できない場合、read_csvで一般的なExceptionではなくCParserErrorがスローされるようになりました。(GH 12506)cエンジンが整数列でNaN値に遭遇した場合、read_csvで一般的なExceptionではなくValueErrorがスローされるようになりました。(GH 12506)true_valuesが指定され、cエンジンがエンコードできないバイトを含む列の要素に遭遇した場合、read_csvで一般的なExceptionではなくValueErrorがスローされるようになりました。(GH 12506)pandas.parser.OverflowError例外は削除され、Pythonの組み込みOverflowError例外に置き換えられました。(GH 12506)pd.read_csv()は、usecolsパラメーターに文字列と整数の組み合わせを許可しなくなりました。(GH 12678)
メソッドto_datetimeのエラー変更#
pd.to_datetime()における、変換可能なエントリとerrors='coerce'、または変換不可能なエントリとerrors='ignore'を伴うunitの引き渡し時のバグ。さらに、errors='raise'の場合、その単位に対して範囲外の値が検出されるとOutOfBoundsDateime例外がスローされます。(GH 11758、GH 13052、GH 13059)
以前の動作
In [27]: pd.to_datetime(1420043460, unit='s', errors='coerce')
Out[27]: NaT
In [28]: pd.to_datetime(11111111, unit='D', errors='ignore')
OverflowError: Python int too large to convert to C long
In [29]: pd.to_datetime(11111111, unit='D', errors='raise')
OverflowError: Python int too large to convert to C long
新しい動作
In [2]: pd.to_datetime(1420043460, unit='s', errors='coerce')
Out[2]: Timestamp('2014-12-31 16:31:00')
In [3]: pd.to_datetime(11111111, unit='D', errors='ignore')
Out[3]: 11111111
In [4]: pd.to_datetime(11111111, unit='D', errors='raise')
OutOfBoundsDatetime: cannot convert input with unit 'D'
その他の API の変更#
Series、DataFrame、Panel、およびMultiIndexの.swaplevel()は、インデックスの最も内側の2つのレベルを入れ替える最初の2つのパラメーターiとjのデフォルトを備えるようになりました。(GH 12934)IndexとTimedeltaIndexの.searchsorted()は、numpyのsearchsorted関数との互換性を維持するために、sorter引数を受け入れるようになりました。(GH 12238)PeriodおよびPeriodIndexは、生のValueErrorではなく、ValueErrorを継承するIncompatibleFrequencyエラーを発生させるようになりました。(GH 12615)カテゴリdtypeの
Series.applyは、渡された関数を.categoriesのそれぞれ(.codesではない)に適用し、可能であればcategorydtypeを返します。(GH 12473)read_csvは、parse_datesがブール値、リスト、辞書のいずれでもない場合にTypeErrorを発生させるようになりました(ドキュメント文字列に一致)。(GH 5636).query()/.eval()のデフォルトはengine=Noneになりました。これは、numexprがインストールされている場合はそれを使用し、そうでない場合はpythonエンジンにフォールバックします。これは、numexprがインストールされている場合の0.18.1以前の動作を模倣しています(以前は、numexprがインストールされていない場合、.query()/.eval()は例外を発生させていました)。(GH 12749)pd.show_versions()にpandas_datareaderバージョンが含まれるようになりました。(GH 12740)ジェネリック関数に適切な
__name__および__qualname__属性を提供します。(GH 12021)pd.concat(ignore_index=True)はデフォルトでRangeIndexを使用するようになりました。(GH 12695)pd.merge()およびDataFrame.join()は、単一レベルのデータフレームと複数レベルのデータフレームをマージ/結合する際にUserWarningを表示するようになりました。(GH 9455、GH 12219)非推奨の
piecewise_polynomial補間メソッドに対するscipy> 0.17との互換性; 代替のfrom_derivativesメソッドのサポート。(GH 12887)
非推奨#
パフォーマンス改善#
.groupby(..).cumcount()のパフォーマンスが改善されました。(GH 11039)skiprows=an_integerを使用する際のpd.read_csv()のメモリ使用量が改善されました。(GH 13005)テーブルの大文字小文字の区別をチェックする際の
DataFrame.to_sqlのパフォーマンスが改善されました。テーブル名が小文字でない場合にのみ、テーブルが正しく作成されているかどうかがチェックされるようになりました。(GH 12876).str.encode()および.str.decode()メソッドのパフォーマンスが改善されました。(GH 13008)入力が数値dtypeの場合の
to_numericのパフォーマンスが改善されました。(GH 12777)IntIndexを使用したスパース演算のパフォーマンスが改善されました。(GH 13036)
バグ修正#
pd.read_csvのusecolsパラメーターは、CSVファイルの行が不均一な場合でも尊重されるようになりました。(GH 12203)axis=1が非単調な順序のインデックスで指定された場合のgroupby.transform(..)のバグ。(GH 12713)freq="Minute"が指定された場合にPeriodおよびPeriodIndexの作成がKeyErrorを発生させるバグ。なお、"Minute" freqはv0.17.0で非推奨となり、代わりにfreq="T"の使用が推奨されます。(GH 11854)PeriodIndexを使用した場合の.resample(...).count()で常にTypeErrorが発生するバグ。(GH 12774)空の場合に
PeriodIndexを使用した.resample(...)がDatetimeIndexにキャストされるバグ。(GH 12868)既存の周波数にリサンプリングする際に
PeriodIndexを使用した.resample(...)のバグ。(GH 12770)異なる
freqを持つPeriodを含むデータの表示でValueErrorが発生するバグ。(GH 12615)Categoricalとdtype='category'が指定された場合のSeries構築のバグ。(GH 12574)強制可能なdtypeを持つ連結がアグレッシブすぎたため、オブジェクトが
display.max_rowsより長い場合に、出力フォーマットで異なるdtypeになるというバグ。(GH 12411、GH 12045、GH 11594、GH 10571、GH 12211)float_formatオプションが呼び出し可能として検証されないバグ。(GH 12706)dropna=Falseで、かつ条件を満たすグループがない場合のGroupBy.filterのバグ。(GH 12768).cum*関数の__name__のバグ。(GH 12021)Float64Inde/Int64IndexをInt64Indexに.astype()する際のバグ。(GH 12881)orient='index'(デフォルト) の場合、.to_json()/.read_json()で整数ベースのインデックスをラウンドトリップする際のバグ。(GH 12866)積み重ね棒グラフを試行すると、
Categoricaldtypeのプロットでエラーが発生するバグ。(GH 13019)numpy1.11以降でのNaT比較との互換性。(GH 12969)非ユニークな
MultiIndexを持つ.drop()のバグ。(GH 12701)タイムゾーン対応およびタイムゾーン非対応のDataFrameの
.concatにおけるバグ。(GH 12467)非文字列を渡す際に
.resample(..).fillna(..)でValueErrorが正しく発生しないバグ。(GH 12952)pd.read_sas()における様々なエンコーディングおよびヘッダー処理のバグ修正。(GH 12659、GH 12654、GH 12647、GH 12809)pd.crosstab()でvalues=Noneの場合にaggfuncが黙って無視されるバグ。(GH 12569)datetime.timeをシリアル化する際のDataFrame.to_jsonにおける潜在的なセグメンテーションフォールト。(GH 11473)0次元配列をシリアル化しようとした際の
DataFrame.to_jsonにおける潜在的なセグメンテーションフォールト。(GH 11299)非ndarray値を持つ
DataFrameまたはSeriesをシリアル化しようとした際のto_jsonにおけるセグメンテーションフォールト;category、sparse、およびdatetime64[ns, tz]dtypeのシリアル化をサポートするようになりました。(GH 10778)サポートされていないdtypeがデフォルトハンドラーに渡されない
DataFrame.to_jsonのバグ。(GH 12554).alignがサブクラスを返さないバグ。(GH 12983)SeriesをDataFrameと整列させる際のバグ。(GH 13037)ABCPanelのバグで、Panel4Dがこの汎用型の有効なインスタンスと見なされていなかった。(GH 12810).groupby(..).apply(..)の場合の.nameの一貫性のバグ。(GH 12363)Timestamp.__repr__のバグにより、ネストされた構造でpprintが失敗する。(GH 12622)Timedelta.minおよびTimedelta.maxのバグ。これらのプロパティは、pandasで認識される真の最小/最大timedeltasを報告するようになりました。詳細はドキュメントを参照してください。(GH 12727)補間を伴う
.quantile()が予期せずfloatに強制変換されるバグ。(GH 12772)空の
Seriesに対する.quantile()が、空のSeriesではなくスカラを返す可能性があるバグ。(GH 12772)大規模なインデクサーで範囲外の
.locがKeyErrorではなくIndexErrorを発生させるバグ。(GH 12527)TimedeltaIndexと.asfreq()を使用した場合のリサンプリングのバグ。以前は最後のフェンスポストが含まれていませんでした。(GH 12926)DataFrame内のCategoricalとの等値テストのバグ。(GH 12564)TimeGrouperが使用された場合、GroupBy.first()、.last()が誤った行を返すバグ。(GH 7453)cエンジンで、引用符付き項目内の改行を含むskiprowsを指定した場合のpd.read_csv()のバグ。(GH 10911、GH 12775)整列されたtz-aware datetime
Seriesを割り当てた際に、DataFrameのタイムゾーンが失われるバグ。(GH 12981)normalize=Trueかつdropna=Trueの場合に、nullが正規化されたカウントに寄与する.value_counts()のバグ。(GH 12558)Series.value_counts()がdtypeがcategoryの場合に名前を失うバグ。(GH 12835)Series.value_counts()がタイムゾーン情報を失うバグ。(GH 12835)CategoricalでSeries.value_counts(normalize=True)がUnboundLocalErrorを発生させるバグ。(GH 12835)Panel.fillna()がinplace=Trueを無視するバグ。(GH 12633)pd.read_csv()で、cエンジンでnames、usecols、parse_datesを同時に指定した場合のバグ。(GH 9755)pd.read_csv()で、cエンジンでdelim_whitespace=Trueとlineterminatorを同時に指定した場合のバグ。(GH 12912)Series.rename、DataFrame.rename、およびDataFrame.rename_axisが、Seriesを再ラベル付けのためのマッピングとして扱わないバグ。(GH 12623).rolling.minおよび.rolling.maxのクリーンアップにより、dtype処理が強化されました。(GH 12373)groupbyで複雑な型がfloatに強制変換されるバグ。(GH 12902)Series.mapが、dtypeがcategoryまたはtz-awaredatetimeの場合にTypeErrorを発生させるバグ。(GH 12473)一部のテスト比較で32ビットプラットフォーム上のバグ。(GH 12972)
RangeIndex構築からフォールバックする際のインデックス強制変換のバグ。(GH 12893)無効な引数(例: floatウィンドウ)が渡された場合に、ウィンドウ関数でより良いエラーメッセージが表示されるようになりました。(GH 12669)
サブクラス化された
Seriesを返すように定義されたサブクラス化されたDataFrameのスライシングで、通常のSeriesが返される場合があるバグ。(GH 11559).strアクセサーメソッドが、入力にnameがあり、結果がDataFrameまたはMultiIndexである場合にValueErrorを発生させるバグ。(GH 12617)空のフレームに対する
DataFrame.last_valid_index()およびDataFrame.first_valid_index()のバグ。(GH 12800)CategoricalIndex.get_locが通常のIndexと異なる結果を返すバグ。(GH 12531)PeriodIndex.resampleで名前が伝播されないバグ。(GH 12769)date_rangeのclosedキーワードとタイムゾーンのバグ。(GH 12684)入力データにtz-aware datetimeとtimedeltaが含まれている場合に
pd.concatがAttributeErrorを発生させるバグ。(GH 12620)pd.concatが空のSeriesを正しく処理しないバグ。(GH 11082)widthがintで指定された場合の.plot.barの整列のバグ。(GH 12979)二項演算子の引数が定数である場合、
fill_valueが無視されるバグ。(GH 12723)bs4フレーバーを使用し、ヘッダーと1列のみのテーブルを解析する際の
pd.read_html()のバグ。(GH 9178)margins=Trueかつdropna=Trueの場合に、nullがマージンカウントに寄与する.pivot_tableのバグ。(GH 12577)dropna=Falseの場合にテーブルのインデックス/列名が消える.pivot_tableのバグ。(GH 12133)margins=Trueかつdropna=Falseの場合に例外を発生させるpd.crosstab()のバグ。(GH 12642)Series.nameのバグで、name属性がハッシュ可能な型になりうる。(GH 12610).describe()がカテゴリ列の情報をリセットするバグ。(GH 11558)時系列で
resample().count()を呼び出すときにloffset引数が適用されなかったバグ。(GH 12725)pd.read_excel()は、キーワード引数namesに関連付けられた列名を受け入れるようになりました。(GH 12870)Indexを含むpd.to_numeric()が、Indexではなくnp.ndarrayを返すバグ。(GH 12777)日時のような値を含む
pd.to_numeric()がTypeErrorを発生させる可能性があるバグ。(GH 12777)スカラを含む
pd.to_numeric()がValueErrorを発生させるバグ。(GH 12777)
貢献者#
このリリースには合計60名がパッチを貢献しました。「+」が付いている方は初めてパッチを貢献された方です。
アンドリュー・フィオーレ・ガートランド +
バスティアン +
ブノワ・ヴィノー +
ブランドン・ローズ +
ダコエックス +
ドリュー・ファスティン +
エルネスト・フレイタス +
フィリップ・テール +
グレゴリー・リフシッツ +
ガボール・リプタック
ハッサン・キビリゲ +
イブリス・リン
イスラエル・サエタ・ペレス +
ジェイソン・ウォロソノビッチ +
ジェフ・リーバック
Joe Jevnik
Joris Van den Bossche
ジョシュア・ストーク +
カ・ウォ・チェン
カービー・シェデン
Kieran O’Mahony
レイフ・ウォルシュ +
マフムード・ラバビディ +
マオユアン・リウ +
マーク・ロス +
マット・ウィットマン
マックスU +
Maximilian Roos
マイケル・ドロエットブーム +
Nick Eubank
Nicolas Bonnotte
OXPHOS +
パウリ・ヴィルタネン +
ピーター・ウォラー +
ピエトロ・バティストン
プラブジョット・シン +
ロビン・ウィルソン
ロジャー・トーマス +
セバスチャン・バンク
スティーブン・フーバー
ティム・ホッパー +
Tom Augspurger
WANG Aiyong
ウェス・ターナー
ワイナンド +
エックスバー +
ヤン・ファカイ +
アドニュー +
アジェンキンズ-カーゴメトリックス +
behzad nouri
チンスキー +
ジーエフヤング
イェプス・ジャーナル +
ジョナスLB +
コトルファ +
ナイラーエースクルー +
ワンズアンドゼロズ
rs2 +
sinhrks
tsdロベル +