バージョン 0.18.1 (2016年5月3日)#

これは0.18.0からのマイナーなバグ修正リリースであり、多数のバグ修正に加え、いくつかの新機能、機能強化、パフォーマンス改善が含まれています。すべてのユーザーにこのバージョンへのアップグレードを推奨します。

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

  • .groupby(...)は、グループごとの.rolling(..).expanding(..).resample(..)との連携を便利にする構文を提供するために強化されました。詳細はこちらを参照してください。

  • pd.to_datetime()DataFrameから日付を組み立てる機能を得ました。詳細はこちらを参照してください。

  • メソッドチェーンの改善については、こちらを参照してください。

  • カスタム営業時間オフセットについては、こちらを参照してください。

  • sparseの処理における多くのバグ修正については、こちらを参照してください。

  • チュートリアルセクションを、@TomAugsburger氏によるモダンなpandasの機能に関する記事で拡張しました。(GH 13045

新機能#

カスタム営業時間#

CustomBusinessHourBusinessHourCustomBusinessDayを組み合わせたもので、任意の休日を指定できます。詳細については、カスタム営業時間を参照してください。(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 12486GH 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 11485GH 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.Pathpy.path.local)を受け入れるようになりました。(GH 12655

  • .weekday_nameプロパティがDatetimeIndexおよび.dtアクセサーのコンポーネントとして追加されました。(GH 11128

  • Index.takeは、allow_fillfill_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')
    
  • IndexMultiIndexを返す.str.get_dummies()をサポートするようになりました。詳細はインジケーター変数の作成を参照してください。(GH 10008GH 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 10560GH 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.nannp.nanとして計算するバグ、これは1であるべきです。(GH 12910

  • SparseArrayの比較出力が誤った結果になるか、ValueErrorを発生させるバグ。(GH 12971

  • SparseSeries.__repr__max_rowsより長い場合にTypeErrorを発生させるバグ。(GH 10560

  • SparseSeries.shapefill_valueを無視するバグ。(GH 10452

  • SparseSeriesSparseArrayがその密な値と異なるdtypeを持つ可能性があるバグ。(GH 12908

  • SparseSeries.reindexfill_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

  • SparseSeriespd.concat()が密になるバグ。(GH 10536

  • SparseDataFramepd.concat()fill_valueを不正確に処理するバグ。(GH 9765

  • SparseDataFramepd.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 12644GH 12638GH 12687

  • IndexTimedeltaIndex.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例外の変更#

cpythonの両エンジンでread_csv APIを標準化するために、空の列またはヘッダーに対して、両方ともValueErrorのサブクラスであるEmptyDataErrorを発生させるようになりました。(GH 12493GH 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 11758GH 13052GH 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 の変更#

  • SeriesDataFramePanel、およびMultiIndex.swaplevel()は、インデックスの最も内側の2つのレベルを入れ替える最初の2つのパラメーターijのデフォルトを備えるようになりました。(GH 12934

  • IndexTimedeltaIndex.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 9455GH 12219

  • 非推奨のpiecewise_polynomial補間メソッドに対するscipy > 0.17との互換性; 代替のfrom_derivativesメソッドのサポート。(GH 12887

非推奨#

  • メソッド名Index.sym_diff()は非推奨であり、Index.symmetric_difference()に置き換えられます。(GH 12591

  • メソッド名Categorical.sort()は非推奨であり、Categorical.sort_values()を推奨します。(GH 12882

パフォーマンス改善#

  • SASリーダーの速度が改善されました。(GH 12656GH 12961

  • .groupby(..).cumcount()のパフォーマンスが改善されました。(GH 11039

  • skiprows=an_integerを使用する際のpd.read_csv()のメモリ使用量が改善されました。(GH 13005

  • テーブルの大文字小文字の区別をチェックする際のDataFrame.to_sqlのパフォーマンスが改善されました。テーブル名が小文字でない場合にのみ、テーブルが正しく作成されているかどうかがチェックされるようになりました。(GH 12876

  • Periodの構築と時系列プロットのパフォーマンスが改善されました。(GH 12903GH 11831

  • .str.encode()および.str.decode()メソッドのパフォーマンスが改善されました。(GH 13008

  • 入力が数値dtypeの場合のto_numericのパフォーマンスが改善されました。(GH 12777

  • IntIndexを使用したスパース演算のパフォーマンスが改善されました。(GH 13036

バグ修正#

  • pd.read_csvusecolsパラメーターは、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

  • Categoricaldtype='category'が指定された場合のSeries構築のバグ。(GH 12574

  • 強制可能なdtypeを持つ連結がアグレッシブすぎたため、オブジェクトがdisplay.max_rowsより長い場合に、出力フォーマットで異なるdtypeになるというバグ。(GH 12411GH 12045GH 11594GH 10571GH 12211

  • float_formatオプションが呼び出し可能として検証されないバグ。(GH 12706

  • dropna=Falseで、かつ条件を満たすグループがない場合のGroupBy.filterのバグ。(GH 12768

  • .cum*関数の__name__のバグ。(GH 12021

  • Float64Inde/Int64IndexInt64Index.astype()する際のバグ。(GH 12881

  • orient='index' (デフォルト) の場合、.to_json()/.read_json()で整数ベースのインデックスをラウンドトリップする際のバグ。(GH 12866

  • 積み重ね棒グラフを試行すると、Categorical dtypeのプロットでエラーが発生するバグ。(GH 13019

  • numpy 1.11以降でのNaT比較との互換性。(GH 12969

  • 非ユニークなMultiIndexを持つ.drop()のバグ。(GH 12701

  • タイムゾーン対応およびタイムゾーン非対応のDataFrameの.concatにおけるバグ。(GH 12467

  • 非文字列を渡す際に.resample(..).fillna(..)ValueErrorが正しく発生しないバグ。(GH 12952

  • pd.read_sas()における様々なエンコーディングおよびヘッダー処理のバグ修正。(GH 12659GH 12654GH 12647GH 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におけるセグメンテーションフォールト; categorysparse、およびdatetime64[ns, tz] dtypeのシリアル化をサポートするようになりました。(GH 10778

  • サポートされていないdtypeがデフォルトハンドラーに渡されないDataFrame.to_jsonのバグ。(GH 12554

  • .alignがサブクラスを返さないバグ。(GH 12983

  • SeriesDataFrameと整列させる際のバグ。(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

  • 大規模なインデクサーで範囲外の.locKeyErrorではなくIndexErrorを発生させるバグ。(GH 12527

  • TimedeltaIndex.asfreq()を使用した場合のリサンプリングのバグ。以前は最後のフェンスポストが含まれていませんでした。(GH 12926

  • DataFrame内のCategoricalとの等値テストのバグ。(GH 12564

  • TimeGrouperが使用された場合、GroupBy.first().last()が誤った行を返すバグ。(GH 7453

  • cエンジンで、引用符付き項目内の改行を含むskiprowsを指定した場合のpd.read_csv()のバグ。(GH 10911GH 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

  • CategoricalSeries.value_counts(normalize=True)UnboundLocalErrorを発生させるバグ。(GH 12835

  • Panel.fillna()inplace=Trueを無視するバグ。(GH 12633

  • pd.read_csv()で、cエンジンでnamesusecolsparse_datesを同時に指定した場合のバグ。(GH 9755

  • pd.read_csv()で、cエンジンでdelim_whitespace=Truelineterminatorを同時に指定した場合のバグ。(GH 12912

  • Series.renameDataFrame.rename、およびDataFrame.rename_axisが、Seriesを再ラベル付けのためのマッピングとして扱わないバグ。(GH 12623

  • .rolling.minおよび.rolling.maxのクリーンアップにより、dtype処理が強化されました。(GH 12373

  • groupbyで複雑な型がfloatに強制変換されるバグ。(GH 12902

  • Series.mapが、dtypeがcategoryまたはtz-aware datetimeの場合に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_rangeclosedキーワードとタイムゾーンのバグ。(GH 12684

  • 入力データにtz-aware datetimeとtimedeltaが含まれている場合にpd.concatAttributeErrorを発生させるバグ。(GH 12620

  • pd.concatが空のSeriesを正しく処理しないバグ。(GH 11082

  • widthintで指定された場合の.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ロベル +