0.23.0の新機能 (2018年5月15日)#

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

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

更新前にAPI変更非推奨機能を確認してください。

警告

2019年1月1日以降、pandasの機能リリースはPython 3のみをサポートします。詳細については、Python 2.7のサポート終了を参照してください。

新機能#

JSONの読み書きのラウンドトリップとorient='table'#

DataFrameは、orient='table'引数を使用することで、メタデータを保持しながらJSONに書き込み、その後読み戻すことができるようになりました(GH 18912およびGH 9146参照)。以前は、利用可能なorientの値のどれも、dtypesやインデックス名などのメタデータの保持を保証していませんでした。

In [1]: df = pd.DataFrame({'foo': [1, 2, 3, 4],
   ...:                    'bar': ['a', 'b', 'c', 'd'],
   ...:                    'baz': pd.date_range('2018-01-01', freq='d', periods=4),
   ...:                    'qux': pd.Categorical(['a', 'b', 'c', 'c'])},
   ...:                   index=pd.Index(range(4), name='idx'))
   ...: 

In [2]: df
Out[2]: 
     foo bar        baz qux
idx                        
0      1   a 2018-01-01   a
1      2   b 2018-01-02   b
2      3   c 2018-01-03   c
3      4   d 2018-01-04   c

[4 rows x 4 columns]

In [3]: df.dtypes
Out[3]: 
foo             int64
bar            object
baz    datetime64[ns]
qux          category
Length: 4, dtype: object

In [4]: df.to_json('test.json', orient='table')

In [5]: new_df = pd.read_json('test.json', orient='table')

In [6]: new_df
Out[6]: 
     foo bar        baz qux
idx                        
0      1   a 2018-01-01   a
1      2   b 2018-01-02   b
2      3   c 2018-01-03   c
3      4   d 2018-01-04   c

[4 rows x 4 columns]

In [7]: new_df.dtypes
Out[7]: 
foo             int64
bar            object
baz    datetime64[ns]
qux          category
Length: 4, dtype: object

文字列indexはラウンドトリップ形式ではサポートされていないことに注意してください。write_jsonでデフォルトで欠損インデックス名を示すために使用されるためです。

In [8]: df.index.name = 'index'

In [9]: df.to_json('test.json', orient='table')

In [10]: new_df = pd.read_json('test.json', orient='table')

In [11]: new_df
Out[11]: 
   foo bar        baz qux
0    1   a 2018-01-01   a
1    2   b 2018-01-02   b
2    3   c 2018-01-03   c
3    4   d 2018-01-04   c

[4 rows x 4 columns]

In [12]: new_df.dtypes
Out[12]: 
foo             int64
bar            object
baz    datetime64[ns]
qux          category
Length: 4, dtype: object

メソッド.assign()が依存引数を受け入れるようになりました#

DataFrame.assign()は、Pythonバージョン3.6以降で依存キーワード引数を受け入れるようになりました(PEP 468も参照)。後続のキーワード引数は、引数が呼び出し可能オブジェクトである場合、以前の引数を参照できるようになりました。詳細については、こちらのドキュメントを参照してください(GH 14207)。

In [13]: df = pd.DataFrame({'A': [1, 2, 3]})

In [14]: df
Out[14]: 
   A
0  1
1  2
2  3

[3 rows x 1 columns]

In [15]: df.assign(B=df.A, C=lambda x: x['A'] + x['B'])
Out[15]: 
   A  B  C
0  1  1  2
1  2  2  4
2  3  3  6

[3 rows x 3 columns]

警告

これにより、既存の列を更新するために.assign()を使用している場合、コードの動作が微妙に変わる可能性があります。以前は、更新されている他の変数を参照する呼び出し可能オブジェクトは「古い」値を取得していました。

以前の動作

In [2]: df = pd.DataFrame({"A": [1, 2, 3]})

In [3]: df.assign(A=lambda df: df.A + 1, C=lambda df: df.A * -1)
Out[3]:
   A  C
0  2 -1
1  3 -2
2  4 -3

新しい動作

In [16]: df.assign(A=df.A + 1, C=lambda df: df.A * -1)
Out[16]: 
   A  C
0  2 -2
1  3 -3
2  4 -4

[3 rows x 2 columns]

列とインデックスレベルの組み合わせでのマージ#

DataFrame.merge()onleft_onright_onパラメータとして渡される文字列は、列名またはインデックスレベル名のいずれかを参照できるようになりました。これにより、インデックスをリセットすることなく、インデックスレベルと列の組み合わせでDataFrameインスタンスをマージすることができます。詳細は、列とレベルでのマージのドキュメントセクションを参照してください。(GH 14355

In [17]: left_index = pd.Index(['K0', 'K0', 'K1', 'K2'], name='key1')

In [18]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
   ....:                      'B': ['B0', 'B1', 'B2', 'B3'],
   ....:                      'key2': ['K0', 'K1', 'K0', 'K1']},
   ....:                     index=left_index)
   ....: 

In [19]: right_index = pd.Index(['K0', 'K1', 'K2', 'K2'], name='key1')

In [20]: right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
   ....:                       'D': ['D0', 'D1', 'D2', 'D3'],
   ....:                       'key2': ['K0', 'K0', 'K0', 'K1']},
   ....:                      index=right_index)
   ....: 

In [21]: left.merge(right, on=['key1', 'key2'])
Out[21]: 
       A   B key2   C   D
key1                     
K0    A0  B0   K0  C0  D0
K1    A2  B2   K0  C1  D1
K2    A3  B3   K1  C3  D3

[3 rows x 5 columns]

列とインデックスレベルの組み合わせでのソート#

DataFrame.sort_values()byパラメータとして渡される文字列は、列名またはインデックスレベル名のいずれかを参照できるようになりました。これにより、インデックスをリセットすることなく、インデックスレベルと列の組み合わせでDataFrameインスタンスをソートすることができます。詳細は、インデックスと値によるソートのドキュメントセクションを参照してください。(GH 14353

# Build MultiIndex
In [22]: idx = pd.MultiIndex.from_tuples([('a', 1), ('a', 2), ('a', 2),
   ....:                                  ('b', 2), ('b', 1), ('b', 1)])
   ....: 

In [23]: idx.names = ['first', 'second']

# Build DataFrame
In [24]: df_multi = pd.DataFrame({'A': np.arange(6, 0, -1)},
   ....:                         index=idx)
   ....: 

In [25]: df_multi
Out[25]: 
              A
first second   
a     1       6
      2       5
      2       4
b     2       3
      1       2
      1       1

[6 rows x 1 columns]

# Sort by 'second' (index) and 'A' (column)
In [26]: df_multi.sort_values(by=['second', 'A'])
Out[26]: 
              A
first second   
b     1       1
      1       2
a     1       6
b     2       3
a     2       4
      2       5

[6 rows x 1 columns]

カスタム型でpandasを拡張(実験的)#

pandasは、必ずしも1次元のNumPy配列ではない配列ライクなオブジェクトを、DataFrameの列またはSeriesの値として保存することをサポートするようになりました。これにより、サードパーティライブラリは、pandasがカテゴリカル、タイムゾーン付きの日時、期間、間隔を実装したのと同様に、NumPyの型に対する拡張を実装することができます。

デモンストレーションとして、IPアドレスを保存するためのIPArray型を提供するcyberpandasを使用します。

In [1]: from cyberpandas import IPArray

In [2]: values = IPArray([
   ...:     0,
   ...:     3232235777,
   ...:     42540766452641154071740215577757643572
   ...: ])
   ...:
   ...:

IPArrayは通常の1次元NumPy配列ではありませんが、pandasのExtensionArrayであるため、pandasのコンテナ内に適切に保存できます。

In [3]: ser = pd.Series(values)

In [4]: ser
Out[4]:
0                         0.0.0.0
1                     192.168.1.1
2    2001:db8:85a3::8a2e:370:7334
dtype: ip

dtypeがipであることに注目してください。基盤となる配列の欠損値セマンティクスが尊重されます。

In [5]: ser.isna()
Out[5]:
0     True
1    False
2    False
dtype: bool

詳細については、拡張型のドキュメントを参照してください。拡張配列を構築した場合は、エコシステムページで公開してください。

GroupByで未観測カテゴリを除外するための新しいキーワードobserved#

カテゴリカルによるグループ化は、未観測カテゴリを出力に含めます。複数のカテゴリカル列でグループ化する場合、これはすべてのカテゴリのデカルト積を取得することを意味し、観測値がない組み合わせも含まれるため、多数のグループが生成される可能性があります。この動作を制御するためにキーワードobservedを追加しました。下位互換性のためにデフォルトはobserved=Falseです。(GH 14942GH 8138GH 15217GH 17594GH 8669GH 20583GH 20902

In [27]: cat1 = pd.Categorical(["a", "a", "b", "b"],
   ....:                       categories=["a", "b", "z"], ordered=True)
   ....: 

In [28]: cat2 = pd.Categorical(["c", "d", "c", "d"],
   ....:                       categories=["c", "d", "y"], ordered=True)
   ....: 

In [29]: df = pd.DataFrame({"A": cat1, "B": cat2, "values": [1, 2, 3, 4]})

In [30]: df['C'] = ['foo', 'bar'] * 2

In [31]: df
Out[31]: 
   A  B  values    C
0  a  c       1  foo
1  a  d       2  bar
2  b  c       3  foo
3  b  d       4  bar

[4 rows x 4 columns]

すべての値を表示する場合(以前の動作)

In [32]: df.groupby(['A', 'B', 'C'], observed=False).count()
Out[32]: 
         values
A B C          
a c bar       0
    foo       1
  d bar       1
    foo       0
  y bar       0
...         ...
z c foo       0
  d bar       0
    foo       0
  y bar       0
    foo       0

[18 rows x 1 columns]

観測された値のみを表示する場合

In [33]: df.groupby(['A', 'B', 'C'], observed=True).count()
Out[33]: 
         values
A B C          
a c foo       1
  d bar       1
b c foo       1
  d bar       1

[4 rows x 1 columns]

ピボット操作の場合、この動作はdropnaキーワードによってすでに制御されています。

In [34]: cat1 = pd.Categorical(["a", "a", "b", "b"],
   ....:                       categories=["a", "b", "z"], ordered=True)
   ....: 

In [35]: cat2 = pd.Categorical(["c", "d", "c", "d"],
   ....:                       categories=["c", "d", "y"], ordered=True)
   ....: 

In [36]: df = pd.DataFrame({"A": cat1, "B": cat2, "values": [1, 2, 3, 4]})

In [37]: df
Out[37]: 
   A  B  values
0  a  c       1
1  a  d       2
2  b  c       3
3  b  d       4

[4 rows x 3 columns]
In [1]: pd.pivot_table(df, values='values', index=['A', 'B'], dropna=True)

Out[1]:
     values
A B
a c     1.0
  d     2.0
b c     3.0
  d     4.0

In [2]: pd.pivot_table(df, values='values', index=['A', 'B'], dropna=False)

Out[2]:
     values
A B
a c     1.0
  d     2.0
  y     NaN
b c     3.0
  d     4.0
  y     NaN
z c     NaN
  d     NaN
  y     NaN

Rolling/Expanding.apply()がraw=Falseを受け入れ、関数にSeriesを渡すように#

Series.rolling().apply()DataFrame.rolling().apply()Series.expanding().apply()、およびDataFrame.expanding().apply()raw=Noneパラメータが追加されました。これはDataFame.apply()と同様です。このパラメータがTrueの場合、適用される関数にnp.ndarrayを送信できます。Falseの場合、Seriesが渡されます。デフォルトはNoneで、これは下位互換性を保持するため、Trueにデフォルト設定され、np.ndarrayが送信されます。将来のバージョンでは、デフォルトはFalseに変更され、Seriesが送信されます。(GH 5071GH 20584

In [38]: s = pd.Series(np.arange(5), np.arange(5) + 1)

In [39]: s
Out[39]: 
1    0
2    1
3    2
4    3
5    4
Length: 5, dtype: int64

Seriesを渡す

In [40]: s.rolling(2, min_periods=1).apply(lambda x: x.iloc[-1], raw=False)
Out[40]: 
1    0.0
2    1.0
3    2.0
4    3.0
5    4.0
Length: 5, dtype: float64

ndarrayを渡す元の動作を模倣する

In [41]: s.rolling(2, min_periods=1).apply(lambda x: x[-1], raw=True)
Out[41]: 
1    0.0
2    1.0
3    2.0
4    3.0
5    4.0
Length: 5, dtype: float64

DataFrame.interpolatelimit_areaキーワード引数が追加されました#

DataFrame.interpolate()に、置き換えられるNaNをさらに制御するためのlimit_areaパラメータが追加されました。limit_area='inside'を使用すると、有効な値に囲まれたNaNのみを埋め、limit_area='outside'を使用すると、既存の有効な値の外側のNaNのみを埋め、内側のNaNは保持します。(GH 16284)詳細については、こちらの完全なドキュメントを参照してください。

In [42]: ser = pd.Series([np.nan, np.nan, 5, np.nan, np.nan,
   ....:                  np.nan, 13, np.nan, np.nan])
   ....: 

In [43]: ser
Out[43]: 
0     NaN
1     NaN
2     5.0
3     NaN
4     NaN
5     NaN
6    13.0
7     NaN
8     NaN
Length: 9, dtype: float64

両方向に1つの連続した内部値を埋める

In [44]: ser.interpolate(limit_direction='both', limit_area='inside', limit=1)
Out[44]: 
0     NaN
1     NaN
2     5.0
3     7.0
4     NaN
5    11.0
6    13.0
7     NaN
8     NaN
Length: 9, dtype: float64

すべての連続した外部値を逆方向に埋める

In [45]: ser.interpolate(limit_direction='backward', limit_area='outside')
Out[45]: 
0     5.0
1     5.0
2     5.0
3     NaN
4     NaN
5     NaN
6    13.0
7     NaN
8     NaN
Length: 9, dtype: float64

すべての連続した外部値を両方向に埋める

In [46]: ser.interpolate(limit_direction='both', limit_area='outside')
Out[46]: 
0     5.0
1     5.0
2     5.0
3     NaN
4     NaN
5     NaN
6    13.0
7    13.0
8    13.0
Length: 9, dtype: float64

関数get_dummiesdtype引数をサポートするようになりました#

get_dummies()は、新しい列のdtypeを指定するdtype引数を受け入れるようになりました。デフォルトはuint8のままです。(GH 18330

In [47]: df = pd.DataFrame({'a': [1, 2], 'b': [3, 4], 'c': [5, 6]})

In [48]: pd.get_dummies(df, columns=['c']).dtypes
Out[48]: 
a      int64
b      int64
c_5     bool
c_6     bool
Length: 4, dtype: object

In [49]: pd.get_dummies(df, columns=['c'], dtype=bool).dtypes
Out[49]: 
a      int64
b      int64
c_5     bool
c_6     bool
Length: 4, dtype: object

Timedeltaのmodメソッド#

mod (%) および divmod 演算が、timedelta-like または数値引数で操作する場合に Timedelta オブジェクトで定義されるようになりました。詳細については、こちらのドキュメントを参照してください。(GH 19365

In [50]: td = pd.Timedelta(hours=37)

In [51]: td % pd.Timedelta(minutes=45)
Out[51]: Timedelta('0 days 00:15:00')

メソッド.rank()NaNが存在する場合でもinf値を処理するようになりました#

以前のバージョンでは、.rank()inf要素にNaNをランクとして割り当てていました。現在はランクが正しく計算されます。(GH 6945

In [52]: s = pd.Series([-np.inf, 0, 1, np.nan, np.inf])

In [53]: s
Out[53]: 
0   -inf
1    0.0
2    1.0
3    NaN
4    inf
Length: 5, dtype: float64

以前の動作

In [11]: s.rank()
Out[11]:
0    1.0
1    2.0
2    3.0
3    NaN
4    NaN
dtype: float64

現在の動作

In [54]: s.rank()
Out[54]: 
0    1.0
1    2.0
2    3.0
3    NaN
4    4.0
Length: 5, dtype: float64

さらに、以前はinfまたは-inf値とNaN値を一緒にランク付けすると、'top'または'bottom'引数を使用した場合にNaNと無限大を区別できませんでした。

In [55]: s = pd.Series([np.nan, np.nan, -np.inf, -np.inf])

In [56]: s
Out[56]: 
0    NaN
1    NaN
2   -inf
3   -inf
Length: 4, dtype: float64

以前の動作

In [15]: s.rank(na_option='top')
Out[15]:
0    2.5
1    2.5
2    2.5
3    2.5
dtype: float64

現在の動作

In [57]: s.rank(na_option='top')
Out[57]: 
0    1.5
1    1.5
2    3.5
3    3.5
Length: 4, dtype: float64

これらのバグは修正されました

  • DataFrame.rank() および Series.rank() で、method='dense' および pct=True の場合に、パーセンタイルランクが個別の観測値の数で使われていなかったバグ (GH 15630)

  • Series.rank() および DataFrame.rank() で、ascending='False'NaN が存在する場合に無限大に対して正しいランクを返せなかったバグ (GH 19538)

  • DataFrameGroupBy.rank()で、無限大とNaNの両方が存在する場合にランクが正しくなかったバグ (GH 20561)

Series.str.catjoinキーワード引数が追加されました#

以前は、Series.str.cat()は、ほとんどのpandasとは対照的に、連結前にSeriesをインデックスで揃えませんでした(GH 18657参照)。このメソッドには、アライメントの方法を制御するためのキーワードjoinが追加されました。以下の例とこちらを参照してください。

v.0.23ではjoinのデフォルトはNone(アライメントなしを意味します)ですが、将来のバージョンのpandasではこのデフォルトは'left'に変更されます。

In [58]: s = pd.Series(['a', 'b', 'c', 'd'])

In [59]: t = pd.Series(['b', 'd', 'e', 'c'], index=[1, 3, 4, 2])

In [60]: s.str.cat(t)
Out[60]: 
0    NaN
1     bb
2     cc
3     dd
Length: 4, dtype: object

In [61]: s.str.cat(t, join='left', na_rep='-')
Out[61]: 
0    a-
1    bb
2    cc
3    dd
Length: 4, dtype: object

さらに、Series.str.cat()CategoricalIndexでも動作するようになりました(以前はValueErrorが発生していました。GH 20842参照)。

DataFrame.astypeCategoricalへの列ごとの変換を実行するようになりました#

DataFrame.astype()は、文字列'category'またはCategoricalDtypeを指定することで、Categoricalへの列ごとの変換を実行できるようになりました。以前は、これを試みるとNotImplementedErrorが発生していました。詳細および例については、ドキュメントのオブジェクト作成セクションを参照してください。(GH 12860GH 18099

文字列'category'を指定すると、列ごとの変換が実行され、特定の列に表示されるラベルのみがカテゴリとして設定されます。

In [62]: df = pd.DataFrame({'A': list('abca'), 'B': list('bccd')})

In [63]: df = df.astype('category')

In [64]: df['A'].dtype
Out[64]: CategoricalDtype(categories=['a', 'b', 'c'], ordered=False, categories_dtype=object)

In [65]: df['B'].dtype
Out[65]: CategoricalDtype(categories=['b', 'c', 'd'], ordered=False, categories_dtype=object)

CategoricalDtypeを指定すると、各列のカテゴリは指定されたdtypeと一致するようになります。

In [66]: from pandas.api.types import CategoricalDtype

In [67]: df = pd.DataFrame({'A': list('abca'), 'B': list('bccd')})

In [68]: cdt = CategoricalDtype(categories=list('abcd'), ordered=True)

In [69]: df = df.astype(cdt)

In [70]: df['A'].dtype
Out[70]: CategoricalDtype(categories=['a', 'b', 'c', 'd'], ordered=True, categories_dtype=object)

In [71]: df['B'].dtype
Out[71]: CategoricalDtype(categories=['a', 'b', 'c', 'd'], ordered=True, categories_dtype=object)

その他の機能強化#

  • 単項+が数値演算子としてSeriesDataFrameで許可されるようになりました(GH 16073

  • xlsxwriterエンジンを使用したto_excel()出力のサポートが改善されました。(GH 16149

  • pandas.tseries.frequencies.to_offset()が先行する「+」記号、例:「+1h」を受け入れるようになりました。(GH 18171

  • MultiIndex.unique()level=引数をサポートし、特定のインデックスレベルから一意の値を取得できるようになりました(GH 17896

  • pandas.io.formats.style.Stylerに、インデックスが出力にレンダリングされるかどうかを決定するメソッドhide_index()が追加されました(GH 14194

  • pandas.io.formats.style.Stylerに、列が出力で非表示になるかどうかを決定するメソッドhide_columns()が追加されました(GH 14194

  • to_datetime()unit=が変換不可能な値で渡された場合に発生するValueErrorの文言が改善されました(GH 14350

  • Series.fillna()がカテゴリカルdtypeのvalueとしてSeriesまたは辞書を受け入れるようになりました(GH 17033

  • pandas.read_clipboard()がqtpyを使用するように更新され、PyQt5、次にPyQt4にフォールバックすることで、Python3と複数のpython-qtバインディングとの互換性が追加されました(GH 17722

  • read_csv()usecols引数がすべての列と一致しない場合に発生するValueErrorの文言が改善されました。(GH 17301

  • DataFrame.corrwith()は、Seriesが渡されたときに非数値列をサイレントに削除するようになりました。以前は例外が発生していました(GH 18570)。

  • IntervalIndexがタイムゾーン認識のIntervalオブジェクトをサポートするようになりました(GH 18537GH 18538

  • Series() / DataFrame()のタブ補完が、MultiIndex()の最初のレベルの識別子も返すようになりました。(GH 16326

  • read_excel()nrowsパラメータが追加されました(GH 16645

  • DataFrame.append()は、呼び出し元のデータフレームの列の型をより多くのケースで保持できるようになりました(例:両方がCategoricalIndexの場合)。 (GH 18359

  • DataFrame.to_json()Series.to_json()index引数を受け入れるようになり、ユーザーはJSON出力からインデックスを除外できるようになりました(GH 17394

  • IntervalIndex.to_tuples()na_tupleパラメータが追加され、NAをタプルのNAとして返すか、NA自体として返すかを制御できるようになりました(GH 18756

  • Categorical.rename_categoriesCategoricalIndex.rename_categories、およびSeries.cat.rename_categoriesが引数として呼び出し可能オブジェクトを受け入れるようになりました(GH 18862

  • IntervalIntervalIndexlength属性が追加されました(GH 18789

  • Resamplerオブジェクトに、機能するResampler.pipeメソッドが追加されました。以前は、pipeへの呼び出しはmeanメソッドに転送されていました(GH 17905)。

  • is_scalar()DateOffsetオブジェクトに対してTrueを返すようになりました(GH 18943)。

  • DataFrame.pivot()values=キーワード引数としてリストを受け入れるようになりました(GH 17160)。

  • pandas.api.extensions.register_dataframe_accessor()pandas.api.extensions.register_series_accessor()、およびpandas.api.extensions.register_index_accessor()が追加されました。これらは、pandasオブジェクトに.catのようなカスタムアクセサを登録するためのpandas下流ライブラリ用アクセサです。詳細については、カスタムアクセサの登録を参照してください(GH 14781)。

  • IntervalIndex.astypeIntervalDtypeを渡された場合にサブタイプ間の変換をサポートするようになりました(GH 19197

  • IntervalIndexとその関連コンストラクタメソッド(from_arraysfrom_breaksfrom_tuples)にdtypeパラメータが追加されました(GH 19262

  • SeriesGroupBy.is_monotonic_increasing()およびSeriesGroupBy.is_monotonic_decreasing()が追加されました(GH 17015

  • サブクラス化されたDataFramesの場合、DataFrame.apply()は、データを適用された関数に渡す際に、Seriesサブクラス(定義されている場合)を保持するようになりました(GH 19822

  • DataFrame.from_dict()columns引数を受け入れるようになりました。これは、orient='index'が使用される場合に列名を指定するために使用できます(GH 18529

  • オプションdisplay.html.use_mathjaxが追加され、Jupyterノートブックでテーブルをレンダリングする際にMathJaxを無効にできるようになりました(GH 19856GH 19824

  • DataFrame.replace()methodパラメータをサポートするようになりました。これは、to_replaceがスカラ、リスト、またはタプルで、valueNoneの場合に置換方法を指定するために使用できます(GH 19632

  • Timestamp.month_name()DatetimeIndex.month_name()、およびSeries.dt.month_name()が利用可能になりました(GH 12805

  • Timestamp.day_name()およびDatetimeIndex.day_name()が利用可能になり、指定されたロケールで曜日名を返すようになりました(GH 12806

  • DataFrame.to_sql()は、基盤となる接続がサポートしていれば、行ごとに挿入するのではなく、複数値挿入を実行するようになりました。SQLAlchemyの複数値挿入をサポートする方言には、mysqlpostgresqlsqlite、およびsupports_multivalues_insertを持つすべての方言が含まれます。(GH 14315GH 8953

  • read_html()displayed_onlyキーワード引数を受け入れるようになり、非表示要素が解析されるかどうかを制御します(デフォルトはTrue)。(GH 20027

  • read_html()は、最初の<tbody>要素だけでなく、<table>内のすべての<tbody>要素を読み取るようになりました。(GH 20690

  • Rolling.quantile()およびExpanding.quantile()interpolationキーワードを受け入れるようになり、デフォルトはlinearです(GH 20497

  • DataFrame.to_pickle()Series.to_pickle()DataFrame.to_csv()Series.to_csv()DataFrame.to_json()Series.to_json()compression=zipを介してzip圧縮がサポートされました。(GH 17778

  • WeekOfMonthコンストラクタがn=0をサポートするようになりました(GH 20517)。

  • DataFrameおよびSeriesが、Python>=3.5で行列乗算(@)演算子をサポートするようになりました(GH 10259

  • DataFrame.to_gbq()およびpandas.read_gbq()のシグネチャとドキュメントが、pandas-gbqライブラリバージョン0.4.0の変更を反映するように更新されました。pandas-gbqライブラリへのintersphinxマッピングが追加されました。(GH 20564

  • バージョン117でStata dtaファイルをエクスポートするための新しいライター、StataWriter117が追加されました。この形式は、最大2,000,000文字の長さの文字列のエクスポートをサポートします(GH 16450

  • to_hdf()およびread_hdf()が、エンコーディングエラー処理を制御するためのerrorsキーワード引数を受け入れるようになりました(GH 20835

  • cut()duplicates='raise'|'drop'オプションを獲得し、重複するエッジでエラーを発生させるか制御できるようになりました(GH 20947

  • date_range()timedelta_range()、およびinterval_range()は、startstopperiodsが指定され、freqが指定されていない場合、線形間隔のインデックスを返すようになりました。(GH 20808GH 20983GH 20976

下位互換性のない API の変更#

依存関係の最小バージョンが上がりました#

依存関係のサポートされる最小バージョンを更新しました(GH 15184)。インストールされている場合、現在は以下が必要です。

パッケージ

最小バージョン

必須

問題

python-dateutil

2.5.0

X

GH 15184

openpyxl

2.4.0

GH 15184

beautifulsoup4

4.2.1

GH 20082

setuptools

24.2.0

GH 20698

Python 3.6+での辞書からのインスタンス化は、辞書の挿入順序を保持します#

Python 3.6までは、Pythonの辞書には正式に定義された順序がありませんでした。Python 3.6以降のバージョンでは、辞書は挿入順序によって並べ替えられます(PEP 468を参照)。Python 3.6以降のバージョンを使用している場合、pandasは辞書からSeriesまたはDataFrameを作成する際に、辞書の挿入順序を使用します。(GH 19884

以前の動作(およびPython < 3.6での現在の動作)

In [16]: pd.Series({'Income': 2000,
   ....:            'Expenses': -1500,
   ....:            'Taxes': -200,
   ....:            'Net result': 300})
Out[16]:
Expenses     -1500
Income        2000
Net result     300
Taxes         -200
dtype: int64

上記のSeriesは、インデックス値によってアルファベット順に並べ替えられていることに注目してください。

新しい動作(Python >= 3.6の場合)

In [72]: pd.Series({'Income': 2000,
   ....:            'Expenses': -1500,
   ....:            'Taxes': -200,
   ....:            'Net result': 300})
   ....: 
Out[72]: 
Income        2000
Expenses     -1500
Taxes         -200
Net result     300
Length: 4, dtype: int64

Seriesが挿入順序で並べ替えられていることに注目してください。この新しい動作は、すべての関連するpandas型(SeriesDataFrameSparseSeriesSparseDataFrame)で使用されます。

Python >= 3.6を使用しながら古い動作を保持したい場合は、.sort_index()を使用できます。

In [73]: pd.Series({'Income': 2000,
   ....:            'Expenses': -1500,
   ....:            'Taxes': -200,
   ....:            'Net result': 300}).sort_index()
   ....: 
Out[73]: 
Expenses     -1500
Income        2000
Net result     300
Taxes         -200
Length: 4, dtype: int64

Panelを非推奨化#

Panelは0.20.xリリースで非推奨となり、DeprecationWarningとして表示されていました。Panelを使用すると、今後はFutureWarningが表示されます。3次元データを表現する推奨される方法は、to_frame()を介してDataFrame上にMultiIndexを使用するか、xarrayパッケージを使用することです。pandasは、この変換を自動化するためのto_xarray()メソッドを提供します(GH 13563GH 18324)。

In [75]: import pandas._testing as tm

In [76]: p = tm.makePanel()

In [77]: p
Out[77]:
<class 'pandas.core.panel.Panel'>
Dimensions: 3 (items) x 3 (major_axis) x 4 (minor_axis)
Items axis: ItemA to ItemC
Major_axis axis: 2000-01-03 00:00:00 to 2000-01-05 00:00:00
Minor_axis axis: A to D

MultiIndex DataFrameに変換

In [78]: p.to_frame()
Out[78]:
                     ItemA     ItemB     ItemC
major      minor
2000-01-03 A      0.469112  0.721555  0.404705
           B     -1.135632  0.271860 -1.039268
           C      0.119209  0.276232 -1.344312
           D     -2.104569  0.113648 -0.109050
2000-01-04 A     -0.282863 -0.706771  0.577046
           B      1.212112 -0.424972 -0.370647
           C     -1.044236 -1.087401  0.844885
           D     -0.494929 -1.478427  1.643563
2000-01-05 A     -1.509059 -1.039575 -1.715002
           B     -0.173215  0.567020 -1.157892
           C     -0.861849 -0.673690  1.075770
           D      1.071804  0.524988 -1.469388

[12 rows x 3 columns]

xarray DataArrayに変換

In [79]: p.to_xarray()
Out[79]:
<xarray.DataArray (items: 3, major_axis: 3, minor_axis: 4)>
array([[[ 0.469112, -1.135632,  0.119209, -2.104569],
        [-0.282863,  1.212112, -1.044236, -0.494929],
        [-1.509059, -0.173215, -0.861849,  1.071804]],

       [[ 0.721555,  0.27186 ,  0.276232,  0.113648],
        [-0.706771, -0.424972, -1.087401, -1.478427],
        [-1.039575,  0.56702 , -0.67369 ,  0.524988]],

       [[ 0.404705, -1.039268, -1.344312, -0.10905 ],
        [ 0.577046, -0.370647,  0.844885,  1.643563],
        [-1.715002, -1.157892,  1.07577 , -1.469388]]])
Coordinates:
  * items       (items) object 'ItemA' 'ItemB' 'ItemC'
  * major_axis  (major_axis) datetime64[ns] 2000-01-03 2000-01-04 2000-01-05
  * minor_axis  (minor_axis) object 'A' 'B' 'C' 'D'

pandas.core.commonの削除#

以下のエラー&警告メッセージがpandas.core.commonから削除されました(GH 13634GH 19769

  • PerformanceWarning

  • UnsupportedFunctionCall

  • UnsortedIndexError

  • AbstractMethodError

これらはpandas.errorsからインポートして利用できます (0.19.0以降)。

DataFrame.applyの出力を統一するための変更#

DataFrame.apply()は、axis=1でリストライクなものを返す任意のユーザー定義関数を適用する場合に一貫性がありませんでした。いくつかのバグと不整合が解決されました。適用される関数がSeriesを返す場合、pandasはDataFrameを返します。それ以外の場合、Seriesが返され、これにはリストライクなもの(例:tupleまたはlistが返される場合)も含まれます。(GH 16353GH 17437GH 17970GH 17348GH 17892GH 18573GH 17602GH 18775GH 18901GH 18919)。

In [74]: df = pd.DataFrame(np.tile(np.arange(3), 6).reshape(6, -1) + 1,
   ....:                   columns=['A', 'B', 'C'])
   ....: 

In [75]: df
Out[75]: 
   A  B  C
0  1  2  3
1  1  2  3
2  1  2  3
3  1  2  3
4  1  2  3
5  1  2  3

[6 rows x 3 columns]

以前の動作: 戻り値の形状が元の列の長さと一致する場合、DataFrameが返されました。戻り値の形状が一致しない場合、リストを含むSeriesが返されました。

In [3]: df.apply(lambda x: [1, 2, 3], axis=1)
Out[3]:
   A  B  C
0  1  2  3
1  1  2  3
2  1  2  3
3  1  2  3
4  1  2  3
5  1  2  3

In [4]: df.apply(lambda x: [1, 2], axis=1)
Out[4]:
0    [1, 2]
1    [1, 2]
2    [1, 2]
3    [1, 2]
4    [1, 2]
5    [1, 2]
dtype: object

新しい動作: 適用される関数がリストライクなものを返す場合、常にSeriesを返すようになります。

In [76]: df.apply(lambda x: [1, 2, 3], axis=1)
Out[76]: 
0    [1, 2, 3]
1    [1, 2, 3]
2    [1, 2, 3]
3    [1, 2, 3]
4    [1, 2, 3]
5    [1, 2, 3]
Length: 6, dtype: object

In [77]: df.apply(lambda x: [1, 2], axis=1)
Out[77]: 
0    [1, 2]
1    [1, 2]
2    [1, 2]
3    [1, 2]
4    [1, 2]
5    [1, 2]
Length: 6, dtype: object

列を展開するには、result_type='expand'を使用できます。

In [78]: df.apply(lambda x: [1, 2, 3], axis=1, result_type='expand')
Out[78]: 
   0  1  2
0  1  2  3
1  1  2  3
2  1  2  3
3  1  2  3
4  1  2  3
5  1  2  3

[6 rows x 3 columns]

元の列全体に結果をブロードキャストする(正しい長さのリストライクなもののための古い動作)には、result_type='broadcast'を使用できます。形状は元の列と一致する必要があります。

In [79]: df.apply(lambda x: [1, 2, 3], axis=1, result_type='broadcast')
Out[79]: 
   A  B  C
0  1  2  3
1  1  2  3
2  1  2  3
3  1  2  3
4  1  2  3
5  1  2  3

[6 rows x 3 columns]

Seriesを返すことで、正確な戻り構造と列名を制御できます。

In [80]: df.apply(lambda x: pd.Series([1, 2, 3], index=['D', 'E', 'F']), axis=1)
Out[80]: 
   D  E  F
0  1  2  3
1  1  2  3
2  1  2  3
3  1  2  3
4  1  2  3
5  1  2  3

[6 rows x 3 columns]

連結はソートされなくなります#

将来のバージョンのpandasでは、pandas.concat()は、非連結軸がすでに整列されていない場合、その軸をソートしなくなります。現在の動作は以前と同じ(ソート)ですが、sortが指定されておらず、非連結軸が整列されていない場合に警告が発行されます(GH 4588)。

In [81]: df1 = pd.DataFrame({"a": [1, 2], "b": [1, 2]}, columns=['b', 'a'])

In [82]: df2 = pd.DataFrame({"a": [4, 5]})

In [83]: pd.concat([df1, df2])
Out[83]: 
     b  a
0  1.0  1
1  2.0  2
0  NaN  4
1  NaN  5

[4 rows x 2 columns]

以前の動作(ソート)を維持し、警告を抑制するには、sort=Trueを渡します。

In [84]: pd.concat([df1, df2], sort=True)
Out[84]: 
   a    b
0  1  1.0
1  2  2.0
0  4  NaN
1  5  NaN

[4 rows x 2 columns]

将来の動作(ソートしない)を受け入れるには、sort=Falseを渡します。

この変更はDataFrame.append()にも適用されることに注意してください。このメソッドには、この動作を制御するためのsortキーワードも追加されています。

ビルドの変更#

  • 開発用にpandasを構築するには、cython >= 0.24が必要になりました(GH 18613)。

  • ソースからビルドするには、setup.pysetuptoolsが明示的に必要になりました(GH 18113)。

  • condaレシピがconda-build 3.0+に準拠するように更新されました(GH 18002)。

インデックスのゼロ除算が正しく埋められる#

Indexとそのサブクラスに対する除算演算では、正の数をゼロで割るとnp.inf、負の数をゼロで割ると-np.inf0 / 0np.nanで埋められるようになりました。これは既存のSeriesの動作と一致します。(GH 19322GH 19347

以前の動作

In [6]: index = pd.Int64Index([-1, 0, 1])

In [7]: index / 0
Out[7]: Int64Index([0, 0, 0], dtype='int64')

# Previous behavior yielded different results depending on the type of zero in the divisor
In [8]: index / 0.0
Out[8]: Float64Index([-inf, nan, inf], dtype='float64')

In [9]: index = pd.UInt64Index([0, 1])

In [10]: index / np.array([0, 0], dtype=np.uint64)
Out[10]: UInt64Index([0, 0], dtype='uint64')

In [11]: pd.RangeIndex(1, 5) / 0
ZeroDivisionError: integer division or modulo by zero

現在の動作

In [12]: index = pd.Int64Index([-1, 0, 1])
# division by zero gives -infinity where negative,
# +infinity where positive, and NaN for 0 / 0
In [13]: index / 0

# The result of division by zero should not depend on
# whether the zero is int or float
In [14]: index / 0.0

In [15]: index = pd.UInt64Index([0, 1])
In [16]: index / np.array([0, 0], dtype=np.uint64)

In [17]: pd.RangeIndex(1, 5) / 0

文字列からの一致パターンの抽出#

以前は、str.extract()で文字列から一致するパターンを抽出する場合、単一のグループが抽出されるとSeriesが返され(複数のグループが抽出されるとDataFrameが返されました)。pandas 0.23.0以降、str.extract()は、expandFalseに設定されていない限り、常にDataFrameを返します。最後に、Noneexpandパラメータの許容値でしたが(これはFalseと同等でした)、現在はValueErrorが発生します。(GH 11386

以前の動作

In [1]: s = pd.Series(['number 10', '12 eggs'])

In [2]: extracted = s.str.extract(r'.*(\d\d).*')

In [3]: extracted
Out [3]:
0    10
1    12
dtype: object

In [4]: type(extracted)
Out [4]:
pandas.core.series.Series

新しい動作

In [85]: s = pd.Series(['number 10', '12 eggs'])

In [86]: extracted = s.str.extract(r'.*(\d\d).*')

In [87]: extracted
Out[87]: 
    0
0  10
1  12

[2 rows x 1 columns]

In [88]: type(extracted)
Out[88]: pandas.core.frame.DataFrame

以前の動作を復元するには、expandFalseに設定するだけです。

In [89]: s = pd.Series(['number 10', '12 eggs'])

In [90]: extracted = s.str.extract(r'.*(\d\d).*', expand=False)

In [91]: extracted
Out[91]: 
0    10
1    12
Length: 2, dtype: object

In [92]: type(extracted)
Out[92]: pandas.core.series.Series

CategoricalDtypeorderedパラメータのデフォルト値#

CategoricalDtypeorderedパラメータのデフォルト値がFalseからNoneに変更され、orderedに影響を与えずにcategoriesを更新できるようになりました。Categoricalなどの下流オブジェクトの動作は一貫しているはずです(GH 18790)。

以前のバージョンでは、orderedパラメータのデフォルト値はFalseでした。これにより、ユーザーがorderedが明示的に指定されていない場合にcategoriesを更新しようとすると、orderedパラメータが意図せずにTrueからFalseに変更される可能性がありました。これは、暗黙的にFalseにデフォルト設定されていたためです。ordered=Noneの新しい動作は、orderedの既存の値を保持することです。

新しい動作

In [2]: from pandas.api.types import CategoricalDtype

In [3]: cat = pd.Categorical(list('abcaba'), ordered=True, categories=list('cba'))

In [4]: cat
Out[4]:
[a, b, c, a, b, a]
Categories (3, object): [c < b < a]

In [5]: cdt = CategoricalDtype(categories=list('cbad'))

In [6]: cat.astype(cdt)
Out[6]:
[a, b, c, a, b, a]
Categories (4, object): [c < b < a < d]

上記の例では、変換されたCategoricalordered=Trueを保持していることに注目してください。orderedのデフォルト値がFalseのままであった場合、ordered=Falseが明示的に指定されていなかったにもかかわらず、変換されたCategoricalは順序なしになっていたでしょう。orderedの値を変更するには、新しいdtypeに明示的に渡してください。例:CategoricalDtype(categories=list('cbad'), ordered=False)

上記で議論したorderedの意図しない変換は、astypeがカテゴリからカテゴリへの変換を行うのを妨げていた別のバグ(GH 10696GH 18593)のため、以前のバージョンでは発生しませんでした。これらのバグはこのリリースで修正され、orderedのデフォルト値の変更を促しました。

ターミナルでのDataFrameのより良い整形出力#

以前は、最大列数のデフォルト値はpd.options.display.max_columns=20でした。これは、比較的幅の広いデータフレームがターミナルの幅に収まらず、pandasがこれらの20列を表示するために改行を導入することを意味していました。これにより、比較的読みにくい出力になっていました。

../_images/print_df_old.png

Pythonがターミナルで実行されている場合、印刷されるデータフレームが現在のターミナル幅に収まるように、最大列数が自動的に決定されるようになりました(pd.options.display.max_columns=0)(GH 17023)。PythonがJupyterカーネル(Jupyter QtConsoleやJupyterノートブック、多くのIDEなど)として実行されている場合、この値は自動的に推測できないため、以前のバージョンと同様に20に設定されます。ターミナルでは、これによりはるかに見やすい出力が得られます。

../_images/print_df_new.png

新しいデフォルトが気に入らない場合でも、常にこのオプションを自分で設定できることに注意してください。古い設定に戻すには、この行を実行できます。

pd.options.display.max_columns = 20

Datetimelike APIの変更#

  • デフォルトのTimedeltaコンストラクタが引数としてISO 8601 Duration文字列を受け入れるようになりました(GH 19040

  • dtype='datetime64[ns]'SeriesからNaTを減算すると、dtype='datetime64[ns]'の代わりにdtype='timedelta64[ns]'Seriesが返されるようになりました(GH 18808

  • TimedeltaIndexからNaTの加算または減算は、DatetimeIndexではなくTimedeltaIndexを返します(GH 19124

  • DatetimeIndex.shift()TimedeltaIndex.shift()は、インデックスオブジェクトの周波数がNoneの場合に、NullFrequencyError(以前のバージョンで発生していたValueErrorのサブクラス)を発生させるようになりました(GH 19147

  • dtype='timedelta64[ns]'SeriesからのNaNの加算または減算は、NaNNaTとして扱うのではなく、TypeErrorを発生させるようになりました(GH 19274

  • NaTdatetime.timedeltaの除算は、例外を発生させるのではなく、NaNを返すようになりました(GH 17876

  • dtype='datetime64[ns]'SeriesPeriodIndex間の操作は、正しくTypeErrorを発生させるようになりました(GH 18850

  • タイムゾーン対応のdtype='datetime64[ns]'を持つSeriesの減算で、タイムゾーンが不一致の場合、ValueErrorではなくTypeErrorが発生するようになりました(GH 18817

  • Timestampは、未使用または無効なtzまたはtzinfoキーワード引数を黙って無視しなくなりました(GH 17690

  • Timestampは、無効なfreq引数を黙って無視しなくなりました(GH 5168

  • CacheableOffsetおよびWeekDayは、pandas.tseries.offsetsモジュールで利用できなくなりました(GH 17830

  • pandas.tseries.frequencies.get_freq_group()pandas.tseries.frequencies.DAYSは公開APIから削除されました(GH 18034

  • Series.truncate()およびDataFrame.truncate()は、インデックスがソートされていない場合に、役に立たないKeyErrorではなく、ValueErrorを発生させるようになりました(GH 17935

  • Series.firstおよびDataFrame.firstは、インデックスがDatetimeIndexではない場合に、NotImplementedErrorではなくTypeErrorを発生させるようになりました(GH 20725)。

  • Series.lastおよびDataFrame.lastは、インデックスがDatetimeIndexではない場合に、NotImplementedErrorではなくTypeErrorを発生させるようになりました(GH 20725)。

  • DateOffsetキーワード引数が制限されました。以前は、DateOffsetのサブクラスは任意のキーワード引数を許可しており、予期しない動作につながる可能性がありました。現在は、有効な引数のみが受け入れられます。(GH 17176GH 18226)。

  • pandas.merge()は、タイムゾーン対応とタイムゾーン非対応の列をマージしようとした場合に、より情報量の多いエラーメッセージを提供するようになりました(GH 15800

  • freq=NoneDatetimeIndexおよびTimedeltaIndexにおいて、整数型の配列またはIndexの加算または減算は、TypeErrorではなくNullFrequencyErrorを発生させるようになりました(GH 19895

  • Timestampコンストラクタが、nanosecondキーワード引数または位置引数を受け入れるようになりました(GH 18898

  • DatetimeIndexは、インスタンス化後にtz属性が設定された場合、AttributeErrorを発生させるようになりました(GH 3746

  • pytzタイムゾーンを持つDatetimeIndexは、一貫したpytzタイムゾーンを返すようになりました(GH 18595

その他の API の変更#

  • Series.astype()およびIndex.astype()は、互換性のないdtypeを使用した場合、ValueErrorではなくTypeErrorを発生させるようになりました(GH 18231

  • object dtypedのタイムゾーン対応日時とdtype=objectが指定されたSeriesの構築は、以前は日時dtypeを推論していましたが、現在はobject dtypedのSeriesを返すようになりました(GH 18231

  • 空のdictから構築されたdtype=categorySeriesは、空のリストが渡された場合と一貫して、dtype=float64ではなくdtype=objectのカテゴリを持つようになります(GH 18515)。

  • MultiIndex内のすべてのNaNレベルは、object dtypeではなくfloat dtypeが割り当てられるようになり、Indexとの一貫性が促進されます(GH 17929)。

  • MultiIndexのレベル名(Noneでない場合)は一意であることが必須になりました。重複した名前でMultiIndexを作成しようとすると、ValueErrorが発生します(GH 18872)。

  • ハッシュ不可能なname/namesを持つIndex/MultiIndexの構築と名前変更の両方で、TypeErrorが発生するようになりました(GH 20527)。

  • Index.map()は、Seriesおよび辞書入力オブジェクトを受け入れるようになりました(GH 12756GH 18482GH 18509)。

  • DataFrame.unstack()は、objectカラムの場合、デフォルトでnp.nanで埋めるようになりました(GH 12815)。

  • IntervalIndexコンストラクタは、closedパラメーターが入力データの閉じ方が推論されたものと矛盾する場合にエラーを発生させます(GH 18421)。

  • インデックスに欠損値を挿入する機能は、あらゆる種類のインデックスで機能し、渡された型に関係なく、正しい種類の欠損値(NaNNaTなど)を自動的に挿入するようになります(GH 18295)。

  • 重複するラベルで作成された場合、MultiIndexValueErrorを発生させるようになりました(GH 17464)。

  • Series.fillna()は、valueとしてリスト、タプル、またはDataFrameが渡された場合に、ValueErrorの代わりにTypeErrorを発生させるようになりました(GH 18293)。

  • pandas.DataFrame.merge()は、intfloatの列で結合する場合に、float列をobjectにキャストしなくなりました(GH 16572)。

  • pandas.merge()は、互換性のないデータ型で結合しようとするとValueErrorを発生させるようになりました(GH 9780)。

  • UInt64IndexのデフォルトのNA値が0からNaNに変更されました。これは、UInt64Index.where()などのNAでマスクするメソッドに影響します(GH 18398)。

  • setup.pyがリファクタリングされ、すべてのサブパッケージを明示的にリストする代わりにfind_packagesを使用するようになりました(GH 18535)。

  • read_excel()のキーワード引数の順序がread_csv()と一致するように変更されました(GH 16672)。

  • wide_to_long()は以前、数値のようなサフィックスをobject dtypeとして保持していました。現在、可能な場合は数値にキャストされます(GH 17627)。

  • read_excel()では、comment引数が名前付きパラメータとして公開されるようになりました(GH 18735)。

  • read_excel()のキーワード引数の順序がread_csv()と一致するように変更されました(GH 16672)。

  • オプションhtml.bordermode.use_inf_as_nullは以前のバージョンで非推奨でしたが、これらはDeprecationWarningではなくFutureWarningを表示するようになります(GH 19003)。

  • IntervalIndexIntervalDtypeは、カテゴリカル、オブジェクト、文字列のサブタイプをサポートしなくなりました(GH 19016)。

  • IntervalDtypeは、サブタイプに関係なく'interval'と比較されたときにTrueを返すようになり、IntervalDtype.nameは、サブタイプに関係なく'interval'を返すようになります(GH 18980)。

  • drop()drop()drop()drop()で、重複のある軸に存在しない要素をドロップする場合、ValueErrorの代わりにKeyErrorが発生するようになりました(GH 19186)。

  • Series.to_csv()は、DataFrame.to_csv()compression引数と同じように機能するcompression引数を受け入れるようになりました(GH 18958)。

  • 互換性のないインデックス型を持つIntervalIndexでの集合演算(ユニオン、差など)は、ValueErrorではなくTypeErrorを発生させるようになりました(GH 19329)。

  • DateOffsetオブジェクトがより単純にレンダリングされるようになりました。例えば、<DateOffset: kwds={'days': 1}>ではなく<DateOffset: days=1>です(GH 19403)。

  • Categorical.fillnaは、valuemethodキーワード引数を検証するようになりました。Series.fillna()の動作と一致し、両方またはどちらも指定されていない場合にエラーを発生させます(GH 19682)。

  • pd.to_datetime('today')は、pd.Timestamp('today')と一貫して、datetimeを返すようになりました。以前はpd.to_datetime('today').normalized() datetimeを返していました(GH 19935)。

  • Series.str.replace()は、オプションのregexキーワードを受け入れるようになりました。これをFalseに設定すると、正規表現置換ではなくリテラル文字列置換が使用されます(GH 16808)。

  • DatetimeIndex.strftime()PeriodIndex.strftime()は、類似のアクセサと一貫性を持たせるために、numpy配列ではなくIndexを返すようになりました(GH 20127)。

  • 長さ1のリストからSeriesを構築する場合、より長いインデックスが指定されていても、このリストがブロードキャストされなくなりました(GH 19714GH 20391)。

  • DataFrame.to_dict()orient='index'を使用する場合、intとfloatの列のみを持つDataFrameの場合、int列がfloatにキャストされなくなりました(GH 18580)。

  • Series.rolling().aggregate()DataFrame.rolling().aggregate()、またはその拡張版に渡されるユーザー定義関数は、np.arrayではなく、常にSeriesが渡されるようになりました。.apply()にはrawキーワードのみがあり、詳細はこちらを参照してください。これは、pandas全体での.aggregate()のシグネチャと一貫しています(GH 20584)。

  • RollingおよびExpandingタイプは、反復時にNotImplementedErrorを発生させます(GH 11704)。

非推奨#

  • Series.from_arraySparseSeries.from_arrayは非推奨になりました。代わりに通常のコンストラクタSeries(..)SparseSeries(..)を使用してください(GH 18213)。

  • DataFrame.as_matrixは非推奨になりました。代わりにDataFrame.valuesを使用してください(GH 18458)。

  • Series.asobjectDatetimeIndex.asobjectPeriodIndex.asobjectTimeDeltaIndex.asobjectは非推奨になりました。代わりに.astype(object)を使用してください(GH 18572)。

  • キーのタプルによるグループ化は、FutureWarningを発行し、非推奨になりました。将来的には、'by'に渡されたタプルは、タプルを複数のキーとして扱うのではなく、常に実際のタプルである単一のキーを参照するようになります。以前の動作を保持するには、タプルの代わりにリストを使用してください(GH 18314)。

  • Series.validは非推奨になりました。代わりにSeries.dropna()を使用してください(GH 18800)。

  • read_excel()skip_footerパラメーターを非推奨にしました。代わりにskipfooterを使用してください(GH 18836)。

  • ExcelFile.parse()は、read_excel()との一貫性のために、sheetnamesheet_nameに置き換えることを非推奨にしました(GH 20920)。

  • is_copy属性は非推奨であり、将来のバージョンで削除されます(GH 18801)。

  • IntervalIndex.from_intervalsは、IntervalIndexコンストラクタを推奨して非推奨になりました(GH 19263)。

  • DataFrame.from_itemsは非推奨になりました。代わりにDataFrame.from_dict()を使用するか、キーの順序を保持したい場合はDataFrame.from_dict(OrderedDict())を使用してください(GH 17320GH 17312)。

  • MultiIndexまたはFloatIndexを、一部の欠損キーを含むリストでインデックス付けすると、他の種類のインデックスと一貫して、FutureWarningが表示されるようになりました(GH 17758)。

  • .apply()broadcastパラメーターは非推奨になり、result_type='broadcast'が推奨されます(GH 18577)。

  • .apply()reduceパラメーターは非推奨になり、result_type='reduce'が推奨されます(GH 18577)。

  • factorize()orderパラメーターは非推奨であり、将来のリリースで削除されます(GH 19727)。

  • Timestamp.weekday_nameDatetimeIndex.weekday_nameSeries.dt.weekday_nameは非推奨になり、代わりにTimestamp.day_name()DatetimeIndex.day_name()Series.dt.day_name()が推奨されます(GH 12806)。

  • pandas.tseries.plotting.tsplotは非推奨になりました。代わりにSeries.plot()を使用してください(GH 18627)。

  • Index.summary()は非推奨であり、将来のバージョンで削除されます(GH 18217)。

  • NDFrame.get_ftype_counts()は非推奨であり、将来のバージョンで削除されます(GH 18243)。

  • DataFrame.to_records()convert_datetime64パラメーターは非推奨になり、将来のバージョンで削除されます。このパラメーターの動機となったNumPyのバグは解決されました。このパラメーターのデフォルト値もTrueからNoneに変更されました(GH 18160)。

  • Series.rolling().apply()DataFrame.rolling().apply()Series.expanding().apply()、およびDataFrame.expanding().apply()は、デフォルトでnp.arrayを渡すことを非推奨にしました。何を渡すかを明示するために、新しいrawパラメーターを渡す必要があります(GH 20584)。

  • SeriesクラスとIndexクラスのdatabasestridesflags、およびitemsizeプロパティは非推奨になり、将来のバージョンで削除されます(GH 20419)。

  • DatetimeIndex.offsetは非推奨になりました。代わりにDatetimeIndex.freqを使用してください(GH 20716)。

  • 整数ndarrayとTimedelta間の切り捨て除算は非推奨です。代わりにTimedelta.valueで除算してください(GH 19761)。

  • PeriodIndex.freqの設定(正しく機能することが保証されていませんでした)は非推奨です。代わりにPeriodIndex.asfreq()を使用してください(GH 20678)。

  • Index.get_duplicates()は非推奨であり、将来のバージョンで削除されます(GH 20239)。

  • Categorical.takeにおける負のインデックスの以前のデフォルト動作は非推奨です。将来のバージョンでは、欠損値を意味するのではなく、右からの位置インデックスを意味するように変更されます。この将来の動作は、Series.take()と一貫しています(GH 20664)。

  • DataFrame.dropna()axisパラメーターに複数の軸を渡すことは非推奨であり、将来のバージョンで削除されます(GH 20987)。

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

  • 廃止されたCategorical(codes, categories)の使用(例えば、Categorical()の最初の2つの引数のdtypeが異なる場合に発行され、Categorical.from_codesの使用が推奨されていた)に対する警告は削除されました(GH 8074)。

  • MultiIndexlevelsおよびlabels属性は直接設定できなくなりました(GH 4039)。

  • pd.tseries.util.pivot_annualは削除されました(v0.19から非推奨)。代わりにpivot_tableを使用してください(GH 18370)。

  • pd.tseries.util.isleapyearは削除されました(v0.19から非推奨)。代わりにDatetimeライクオブジェクトの.is_leap_yearプロパティを使用してください(GH 18370)。

  • pd.ordered_mergeは削除されました(v0.19から非推奨)。代わりにpd.merge_orderedを使用してください(GH 18459)。

  • SparseListクラスは削除されました(GH 14007)。

  • pandas.io.wbおよびpandas.io.dataスタブモジュールは削除されました(GH 13735)。

  • Categorical.from_arrayは削除されました(GH 13854)。

  • DataFrameおよびSeriesのrolling/expanding/ewmメソッドからfreqおよびhowパラメーターが削除されました(v0.18から非推奨)。代わりに、メソッドを呼び出す前にリサンプルしてください(GH 18601およびGH 18668)。

  • DatetimeIndex.to_datetimeTimestamp.to_datetimePeriodIndex.to_datetime、およびIndex.to_datetimeは削除されました(GH 8254GH 14096GH 14113)。

  • read_csv()skip_footerパラメーターを削除しました(GH 13386)。

  • read_csv()as_recarrayパラメーターを削除しました(GH 13373)。

  • read_csv()buffer_linesパラメーターを削除しました(GH 13360)。

  • read_csv()compact_intsおよびuse_unsignedパラメーターを削除しました(GH 13323)。

  • Timestampクラスは、offset属性を削除し、freqを採用しました(GH 13593)。

  • SeriesCategorical、およびIndexクラスはreshapeメソッドを削除しました(GH 13012)。

  • pandas.tseries.frequencies.get_standard_freqは削除され、pandas.tseries.frequencies.to_offset(freq).rule_codeが推奨されます(GH 13874)。

  • pandas.tseries.frequencies.to_offsetからfreqstrキーワードが削除され、freqが推奨されます(GH 13874)。

  • Panel4DおよびPanelNDクラスは削除されました(GH 13776)。

  • Panelクラスはto_longおよびtoLongメソッドを削除しました(GH 19077)。

  • オプションdisplay.line_withおよびdisplay.heightは、それぞれdisplay.widthおよびdisplay.max_rowsに置き換えられ、削除されました(GH 4391GH 19107)。

  • Categoricalクラスのlabels属性は、Categorical.codesに置き換えられ、削除されました(GH 7768)。

  • to_sql()メソッドからflavorパラメーターが削除されました(GH 13611)。

  • モジュールpandas.tools.hashingおよびpandas.util.hashingは削除されました(GH 16223)。

  • トップレベル関数pd.rolling_*pd.expanding_*pd.ewm*は削除されました(v0.18から非推奨)。代わりに、DataFrame/Seriesメソッドのrollingexpandingewmを使用してください(GH 18723)。

  • is_datetime64_dtypeなどの関数に対するpandas.core.commonからのインポートは削除されました。これらはpandas.api.typesにあります(GH 13634GH 19769)。

  • Series.tz_localize()DatetimeIndex.tz_localize()、およびDatetimeIndexinfer_dstキーワードは削除されました。infer_dst=Trueambiguous='infer'と同等であり、infer_dst=Falseambiguous='raise'と同等です(GH 7963)。

  • v0.18.0で.resample()が即時実行から遅延実行(.groupby()のように)に変更された際、互換性(FutureWarning付き)が導入され、操作が引き続き機能するようにされていました。これは完全に削除され、Resamplerは互換性操作を転送しなくなります(GH 20554)。

  • .replace()から長い間非推奨であったaxis=Noneパラメーターを削除しました(GH 20271)。

パフォーマンス改善#

  • SeriesまたはDataFrameのインデクサーは参照サイクルを作成しなくなりました(GH 17956)。

  • to_datetime()にキーワード引数cacheが追加され、重複するdatetime引数の変換パフォーマンスが向上しました(GH 11665)。

  • DateOffsetの算術演算パフォーマンスが向上しました(GH 18218)。

  • TimedeltaオブジェクトのSeriesを日数、秒などに変換する速度が、基礎となるメソッドのベクトル化によって向上しました(GH 18092)。

  • Series/dict入力を伴う.map()のパフォーマンスが向上しました(GH 15081)。

  • Timedeltaのdays、seconds、microsecondsのオーバーライドされたプロパティは削除され、代わりにPython組み込みバージョンが利用されるようになりました(GH 18242)。

  • Series構築は、特定の場合に入力データのコピー数を削減します(GH 17449)。

  • Series.dt.date()およびDatetimeIndex.date()のパフォーマンスが向上しました(GH 18058)。

  • Series.dt.time()およびDatetimeIndex.time()のパフォーマンスが向上しました(GH 18461)。

  • IntervalIndex.symmetric_difference()のパフォーマンスが向上しました(GH 18475)。

  • ビジネス月およびビジネス四半期の頻度を持つDatetimeIndexSeriesの算術演算のパフォーマンスが向上しました(GH 18489)。

  • Series() / DataFrame()のタブ補完が100値に制限され、パフォーマンスが向上しました(GH 18587)。

  • bottleneckがインストールされていない場合、axis=1を指定したDataFrame.median()のパフォーマンスが向上しました(GH 16468)。

  • 大きなインデックスの場合のMultiIndex.get_loc()のパフォーマンスが向上しました。ただし、小さなインデックスの場合のパフォーマンスは低下します(GH 18519)。

  • 未使用レベルがない場合のMultiIndex.remove_unused_levels()のパフォーマンスが向上しました。ただし、未使用レベルがある場合のパフォーマンスは低下します(GH 19289)。

  • 非一意なインデックスの場合のIndex.get_loc()のパフォーマンスが向上しました(GH 19478)。

  • .cov()および.corr()演算におけるペアワイズの.rolling()および.expanding()のパフォーマンスが向上しました(GH 17917)。

  • GroupBy.rank()のパフォーマンスが向上しました(GH 15779)。

  • .min()および.max()における可変.rolling()のパフォーマンスが向上しました(GH 19521)。

  • GroupBy.ffill()およびGroupBy.bfill()のパフォーマンスが向上しました(GH 11296)。

  • GroupBy.any()およびGroupBy.all()のパフォーマンスが向上しました(GH 15435)。

  • GroupBy.pct_change()のパフォーマンスが向上しました(GH 19165)。

  • カテゴリカルdtypeの場合のSeries.isin()のパフォーマンスが向上しました(GH 20003)。

  • 特定のインデックス型を持つSeriesの場合のgetattr(Series, attr)のパフォーマンスが向上しました。これは、DatetimeIndexを持つ大きなSeriesの印刷速度が遅いという形で現れていました(GH 19764)。

  • 一部のオブジェクト列を持つGroupBy.nth()およびGroupBy.last()のパフォーマンス低下が修正されました(GH 19283)。

  • Categorical.from_codes()のパフォーマンスが向上しました(GH 18501)。

ドキュメントの変更#

3月10日に開催されたpandas Documentation Sprintに参加してくださったすべての貢献者に感謝いたします。世界30か所以上から約500人の参加者がありました。これにより、多くのAPI docstringsが大幅に改善されたことに気づかれるでしょう。

あまりにも多くの同時貢献があったため、すべての改善をリリースノートに含めることはできませんが、このGitHub検索で、どれだけのdocstringsが改善されたかをおおよそ把握できるはずです。

スプリントを組織してくれたMarc Garciaに特に感謝いたします。詳細については、スプリントをまとめたNumFOCUSのブログ記事をお読みください。

  • 「numpy」のスペルを「NumPy」に、「python」を「Python」に変更しました(GH 19017)。

  • コードサンプルを導入する際の一貫性(コロンまたはピリオドを使用)。文章を書き直してより明確にし、関数、メソッド、クラスへのより動的な参照を追加しました(GH 18941GH 18948GH 18973GH 19017)。

  • マージに関するドキュメントの結合セクションにDataFrame.assign()への参照を追加しました(GH 18665)。

バグ修正#

カテゴリカル#

警告

pandas 0.21でCategoricalDtypeにバグのクラスが導入され、同じカテゴリを持つが順序が異なる複数の順序なしCategorical配列を比較する際に、mergeconcat、インデックス付けなどの操作の正確性に影響を与えました。これらの操作を行う前に、アップグレードまたはカテゴリを手動で揃えることを強くお勧めします。

  • 同じカテゴリを持つが順序が異なる2つの順序なしCategorical配列を比較する際に、Categorical.equalsが誤った結果を返すバグ(GH 16603)。

  • カテゴリの順序が異なる順序なしカテゴリカルデータの場合に、pandas.api.types.union_categoricals()が誤った結果を返すバグ。これはCategoricalデータを含むpandas.concat()に影響を与えました(GH 19096)。

  • 同じカテゴリを持つが順序が異なる順序なしCategoricalで結合する際に、pandas.merge()が誤った結果を返すバグ(GH 19551)。

  • targetselfと同じカテゴリを持つが順序が異なる順序なしCategoricalである場合に、CategoricalIndex.get_indexer()が誤った結果を返すバグ(GH 19551)。

  • カテゴリカルdtypeを持つIndex.astype()で、結果のインデックスがすべての種類のインデックスに対してCategoricalIndexに変換されないバグ(GH 18630)。

  • Series.astype()およびCategorical.astype()で、既存のカテゴリカルデータが更新されないバグ(GH 10696GH 18593)。

  • expand=Trueを指定したSeries.str.split()が、空の文字列に対して誤ってIndexErrorを発生させるバグ(GH 20002)。

  • dtype=CategoricalDtype(...)を指定したIndexコンストラクタで、categoriesorderedが保持されないバグ(GH 19032)。

  • スカラーとdtype=CategoricalDtype(...)を指定したSeriesコンストラクタで、categoriesorderedが保持されないバグ(GH 19565)。

  • Categorical.__iter__がPython型に変換されないバグ(GH 19909)。

  • pandas.factorize()uniquesに対して一意のコードを返すバグ。これは入力と同じdtypeを持つCategoricalを返すようになりました(GH 19721)。

  • pandas.factorize()uniquesの戻り値に欠損値の項目を含めるバグ(GH 19721)。

  • カテゴリカルデータを持つSeries.take()で、indices内の-1をSeriesの最後の要素ではなく欠損値マーカーとして解釈するバグ(GH 20664)。

日付時刻ライク#

  • Series.__sub__()が、非ナノ秒のnp.datetime64オブジェクトをSeriesから減算すると、誤った結果を返すバグ(GH 7996)。

  • DatetimeIndexTimedeltaIndexの加算と減算で、ゼロ次元の整数配列が誤った結果を返すバグ(GH 19012)。

  • DatetimeIndexおよびTimedeltaIndexで、DateOffsetオブジェクトの配列ライクを加算または減算すると、エラーが発生するか(np.arraypd.Index)、または誤ってブロードキャストされる(pd.Series)バグ(GH 18849)。

  • Series.__add__()が、dtype timedelta64[ns]のSeriesをタイムゾーン対応のDatetimeIndexに加算すると、誤ってタイムゾーン情報を削除するバグ(GH 13905)。

  • PeriodオブジェクトをdatetimeまたはTimestampオブジェクトに加算すると、正しくTypeErrorが発生するようになりました(GH 17983)。

  • Timestamp の配列と比較すると RecursionError が発生する Timestamp のバグ (GH 15183)

  • スカラ timedelta に対して操作を行うと例外が発生する Series の床除算のバグ (GH 18846)

  • DatetimeIndex の repr が一日の終わりの高精度時刻値 (例: 23:59:59.999999999) を表示しないバグ (GH 19030)

  • 非 ns timedelta 単位への .astype() で間違った dtype が保持されるバグ (GH 19176, GH 19223, GH 12425)

  • NaT から Series を減算すると、誤って NaT が返されるバグ (GH 19158)

  • 単調な PeriodIndexSeries.truncate()TypeError を発生させるバグ (GH 17717)

  • periodsfreq を使用する pct_change() が異なる長さの出力を返していたバグ (GH 7292)

  • DatetimeIndexNone または datetime.date オブジェクトの比較で、==!= の比較において、すべて False およびすべて True ではなく TypeError が発生するバグ (GH 19301)

  • Timestampto_datetime() で、境界をわずかに超えるタイムスタンプを表す文字列が OutOfBoundsDatetime を発生させる代わりに誤って切り捨てられていたバグ (GH 19382)

  • Timestamp.floor() および DatetimeIndex.floor() で、遠い未来および過去のタイムスタンプが正しく丸められていなかったバグ (GH 19206)

  • to_datetime()errors='coerce' および utc=True を指定して範囲外の datetime を渡すと、NaT にパースされる代わりに OutOfBoundsDatetime が発生していたバグ (GH 19612)

  • DatetimeIndexTimedeltaIndex の加算と減算で、返されるオブジェクトの名前が常に一貫して設定されていなかったバグ (GH 19744)

  • DatetimeIndexTimedeltaIndex の加算と減算で、numpy 配列との演算が TypeError を発生させていたバグ (GH 19847)

  • DatetimeIndexTimedeltaIndexfreq 属性の設定が完全にサポートされていなかったバグ (GH 20678)

Timedelta#

  • Timedelta.__mul__()NaT を乗算すると TypeError が発生する代わりに NaT が返されていたバグ (GH 19819)

  • dtype='timedelta64[ns]'SeriesTimedeltaIndex の加算または減算の結果が dtype='int64' にキャストされていたバグ (GH 17250)

  • dtype='timedelta64[ns]'SeriesTimedeltaIndex の加算または減算が誤った名前の Series を返すことがあったバグ (GH 19043)

  • Timedelta.__floordiv__() および Timedelta.__rfloordiv__() で、多くの互換性のない numpy オブジェクトによる除算が誤って許可されていたバグ (GH 18846)

  • スカラ timedelta 型オブジェクトを TimedeltaIndex で除算すると、逆数演算が行われるバグ (GH 19125)

  • TimedeltaIndexSeries で除算すると Series ではなく TimedeltaIndex が返されるバグ (GH 19042)

  • Timedelta.__add__()Timedelta.__sub__()np.timedelta64 オブジェクトを加算または減算すると、Timedelta ではなく別の np.timedelta64 が返されていたバグ (GH 19738)

  • Timedelta.__floordiv__()Timedelta.__rfloordiv__()Tick オブジェクトを操作すると、数値が返される代わりに TypeError が発生していたバグ (GH 19738)

  • Period.asfreq()datetime(1, 1, 1) 付近の期間が誤って変換される可能性があったバグ (GH 19643, GH 19834)

  • Timedelta.total_seconds() で精度エラーが発生するバグ。例えば Timedelta('30S').total_seconds()==30.000000000000004 (GH 19458)

  • Timedelta.__rmod__()numpy.timedelta64 を操作すると Timedelta ではなく timedelta64 オブジェクトが返されていたバグ (GH 19820)

  • TimedeltaIndexTimedeltaIndex で乗算すると、長さが一致しない場合に ValueError が発生する代わりに TypeError が発生するようになりました (GH 19333)

  • TimedeltaIndexnp.timedelta64 オブジェクトでインデックス化すると TypeError が発生していたバグ (GH 20393)

タイムゾーン#

  • タイムゾーンを持たない値とタイムゾーンを持つ値の両方を含む配列から Series を作成すると、dtype がオブジェクトではなくタイムゾーンを持つ Series になるバグ (GH 16406)

  • タイムゾーンを持つ DatetimeIndexNaT の比較で、誤って TypeError が発生していたバグ (GH 19276)

  • タイムゾーンを持つ dtype 間の変換、およびタイムゾーンを持つ dtype からタイムゾーンを持たない dtype への変換における DatetimeIndex.astype() のバグ (GH 18951)

  • タイムゾーンを持つ datetime 型オブジェクトとタイムゾーンを持たない datetime 型オブジェクトを比較しようとすると TypeError が発生しなかった DatetimeIndex の比較のバグ (GH 18162)

  • datetime64[ns, tz] dtype を持つ Series コンストラクタで、タイムゾーンを持たない datetime 文字列のローカライズのバグ (GH 174151)

  • Timestamp.replace() が夏時間移行を適切に処理するようになりました (GH 18319)

  • タイムゾーンを持つ DatetimeIndex で、TimedeltaIndex または dtype='timedelta64[ns]' の配列との加算/減算が正しくなかったバグ (GH 17558)

  • DatetimeIndex.insert() で、タイムゾーンを持つインデックスに NaT を挿入すると誤って例外が発生していたバグ (GH 16357)

  • DataFrame コンストラクタで、タイムゾーンを持つ DatetimeIndex と指定された列名によって空の DataFrame が作成されるバグ (GH 19157)

  • Timestamp.tz_localize() で、最小または最大の有効値に近いタイムスタンプをローカライズすると、オーバーフローして誤ったナノ秒値を持つタイムスタンプが返される可能性があったバグ (GH 12677)

  • 固定タイムゾーンオフセットでローカライズされた DatetimeIndex を反復処理すると、ナノ秒精度がマイクロ秒に丸められるバグ (GH 19603)

  • タイムゾーンを持つ値に対して DataFrame.diff()IndexError を発生させていたバグ (GH 18578)

  • melt() がタイムゾーンを持つ dtype をタイムゾーンを持たない dtype に変換していたバグ (GH 15785)

  • タイムゾーンを持つ値を持つ単一の列に対して Dataframe.dropna() が呼び出された場合に Dataframe.count()ValueError を発生させていたバグ (GH 13407)

オフセット#

  • WeekOfMonth および Week で、加算と減算が正しくロールしていなかったバグ (GH 18510, GH 18672, GH 18864)

  • WeekOfMonth および LastWeekOfMonth で、コンストラクタのデフォルトキーワード引数が ValueError を発生させていたバグ (GH 19142)

  • FY5253QuarterLastWeekOfMonth で、ロールバックとロールフォワードの動作が加算と減算の動作と一貫していなかったバグ (GH 18854)

  • FY5253 で、年末の日付だが真夜中に正規化されていない日付に対して datetime の加算と減算が誤ってインクリメントされていたバグ (GH 18854)

  • FY5253 で、日付オフセットが算術演算で誤って AssertionError を発生させる可能性があったバグ (GH 14774)

数値#

  • int または float のリストを持つ Series コンストラクタで、dtype=strdtype='str' または dtype='U' を指定してもデータ要素が文字列に変換されなかったバグ (GH 16605)

  • Index の乗算および除算メソッドで、Series を操作すると Series オブジェクトではなく Index オブジェクトが返されていたバグ (GH 19042)

  • DataFrame コンストラクタで、非常に大きな正の数または非常に大きな負の数を含むデータが OverflowError を引き起こしていたバグ (GH 18584)

  • Index コンストラクタで dtype='uint64' を指定した場合、int 型の浮動小数点数が UInt64Index に強制されなかったバグ (GH 18400)

  • DataFrame のフレキシブルな算術演算 (例: df.add(other, fill_value=foo)) で、None 以外の fill_value を指定した場合、フレームまたは other のいずれかの長さがゼロであるエッジケースで NotImplementedError が発生しなかったバグ (GH 19522)

  • 数値型 dtype の Index オブジェクトと timedelta 型のスカラーの乗算および除算で、TypeError が発生する代わりに TimedeltaIndex が返されるバグ (GH 19333)

  • Series.pct_change() および DataFrame.pct_change()fill_methodNone でない場合に 0 ではなく NaN が返されていたバグ (GH 19873)

文字列#

  • Series.str.get() で、値が辞書であり、インデックスがキーにない場合に KeyError が発生していたバグ (GH 20671)

インデックス付け#

  • 混合型のタプルのリストからの Index 構築のバグ (GH 18505)

  • Index.drop() で、タプルと非タプルの両方のリストを渡した場合のバグ (GH 18304)

  • DataFrame.drop()Panel.drop()Series.drop()Index.drop() で、重複を含む軸から存在しない要素を削除する際に KeyError が発生しないバグ (GH 19186)

  • datetime 型の Index のインデックス付けで、IndexError ではなく ValueError が発生していたバグ (GH 18386)。

  • Index.to_series()index および name kwargs を受け入れるようになりました (GH 18699)

  • DatetimeIndex.to_series()index および name kwargs を受け入れるようになりました (GH 18699)

  • 一意でない Index を持つ Series から非スカラ値をインデックス化すると、値が平坦化されて返されるバグ (GH 17610)

  • 欠落しているキーのみを含むイテレータによるインデックス付けで、エラーが発生しなかったバグ (GH 20748)

  • インデックスが整数 dtype であり、目的のキーを含まない場合に、リストキーとスカラキーの間で .ix の不整合が修正されました (GH 20753)

  • 2次元ブール ndarray で DataFrame をインデックス化する際の __setitem__ のバグ (GH 18582)

  • str.extractall で、一致するものがなかった場合に適切な MultiIndex ではなく空の Index が返されていたバグ (GH 19034)

  • IntervalIndex で、空のデータと純粋に NA のデータが構築方法によって一貫性のない方法で構築されていたバグ (GH 18421)

  • IntervalIndex.symmetric_difference() で、非 IntervalIndex との対称差が例外を発生させなかったバグ (GH 18475)

  • IntervalIndex で、空の IntervalIndex を返す集合演算の dtype が間違っていたバグ (GH 19101)

  • DataFrame.drop_duplicates() で、DataFrame に存在しない列を渡しても KeyError が発生しないバグ (GH 19726)

  • 予期しないキーワード引数を無視する Index サブクラスコンストラクタのバグ (GH 19348)

  • Index とそれ自身の差を取る際の Index.difference() のバグ (GH 20040)

  • 値の中央に NaN の行全体がある場合の DataFrame.first_valid_index()DataFrame.last_valid_index() のバグ (GH 20499)。

  • IntervalIndex で、重複するまたは単調でない uint64 データに対して一部のインデックス操作がサポートされていなかったバグ (GH 20636)

  • Series.is_unique で、__ne__ が定義されたオブジェクトを含む Series の場合に標準エラーに出力が表示されるバグ (GH 20661)

  • 単一要素のリストのようなもので代入すると、誤ってリストとして代入される .loc 代入のバグ (GH 19474)

  • 単調減少する DatetimeIndex を持つ Series/DataFrame の部分文字列インデックス付けのバグ (GH 19362)

  • 重複する Index を持つ DataFrame でインプレース操作を実行する際のバグ (GH 17105)

  • 単一の区間を含む IntervalIndex で使用した場合の IntervalIndex.get_loc() および IntervalIndex.get_indexer() のバグ (GH 17284, GH 20921)

  • uint64 インデクサを使用する .loc のバグ (GH 20722)

MultiIndex#

IO#

  • read_html() は、解析失敗後、新しいパーサーで解析を試みる前に、シーク可能な IO オブジェクトを巻き戻すようになりました。パーサーがエラーを発生させ、オブジェクトがシーク不可能である場合、別のパーサーの使用を提案する情報的なエラーが発生します (GH 17975)

  • DataFrame.to_html() は、先頭の <table> タグに id を追加するオプションを持つようになりました (GH 8496)

  • Python 2 で存在しないファイルが渡された場合の read_msgpack() のバグ (GH 15296)

  • read_csv() で、重複する列を持つ MultiIndex が適切に処理されなかったバグ (GH 18062)

  • read_csv() で、辞書型 na_valueskeep_default_na=False を使用した場合に欠損値が正しく処理されなかったバグ (GH 19227)

  • 32ビット、ビッグエンディアンアーキテクチャでヒープ破損を引き起こす read_csv() のバグ (GH 20785)

  • read_sas() で、0 変数のファイルが誤って AttributeError を発生させていたバグ。現在は EmptyDataError を発生させます (GH 18184)

  • DataFrame.to_latex() で、目に見えないプレースホルダーとして機能する中括弧のペアがエスケープされていたバグ (GH 18667)

  • DataFrame.to_latex() で、MultiIndexNaN があると IndexError または間違った出力が発生するバグ (GH 14249)

  • DataFrame.to_latex() で、文字列以外のインデックスレベル名が AttributeError を引き起こすバグ (GH 19981)

  • DataFrame.to_latex() で、インデックス名と index_names=False オプションの組み合わせが間違った出力を引き起こすバグ (GH 18326)

  • DataFrame.to_latex() で、空文字列を名前とする MultiIndex が間違った出力を引き起こすバグ (GH 18669)

  • DataFrame.to_latex() で、欠落したスペース文字が間違ったエスケープを引き起こし、場合によっては無効な LaTeX を生成するバグ (GH 20859)

  • read_json() で、大きな数値が OverflowError を引き起こしていたバグ (GH 18842)

  • DataFrame.to_parquet() で、書き込み先が S3 の場合に例外が発生していたバグ (GH 19134)

  • すべての Excel ファイルタイプで DataFrame.to_excel()Interval がサポートされるようになりました (GH 19242)

  • すべての Excel ファイルタイプで DataFrame.to_excel()Timedelta がサポートされるようになりました (GH 19242, GH 9155, GH 19900)

  • 非常に古いファイルで呼び出された場合に pandas.io.stata.StataReader.value_labels()AttributeError を発生させていたバグ。現在は空の dict を返します (GH 19417)

  • バージョン 0.20 より前に作成された TimedeltaIndex または Float64Index を持つオブジェクトをアンピクルする際の read_pickle() のバグ (GH 19939)

  • pandas.io.json.json_normalize() で、いずれかのサブレコードの値が NoneType である場合にサブレコードが正しく正規化されないバグ (GH 20030)

  • read_csv()usecols パラメータで、文字列を渡した場合にエラーが正しく発生しないバグ (GH 20529)

  • ソフトリンクのあるファイルを読み込む際に HDFStore.keys() が例外を発生させるバグ (GH 20523)

  • HDFStore.select_column() で、有効なストアではないキーが KeyError ではなく AttributeError を発生させていたバグ (GH 17912)

プロット#

  • プロットしようとしたが matplotlib がインストールされていない場合のより良いエラーメッセージ (GH 19810)。

  • DataFrame.plot() は、x または y 引数が不適切に形成されている場合に ValueError を発生させるようになりました (GH 18671)

  • DataFrame.plot() で、x および y 引数を位置として指定した場合に、線グラフ、棒グラフ、面グラフで参照される列が誤っていたバグ (GH 20056)

  • datetime.time() と小数秒で目盛りラベルをフォーマットする際のバグ (GH 18478)。

  • Series.plot.kde() は、docstring で引数 indbw_method を公開しました (GH 18461)。引数 ind は整数 (サンプル点数) にもできるようになりました。

  • DataFrame.plot() は、y 引数に複数の列をサポートするようになりました (GH 19699)

GroupBy/resample/rolling#

  • 単一の列でグループ化し、listtuple のようなクラスで集約する際のバグ (GH 18079)

  • DataFrame.groupby() で、インデックスにないタプルキーで呼び出された場合にエラーを発生させなかった回帰が修正されました (GH 18798)

  • DataFrame.resample() で、labelclosedconvention のサポートされていない (またはタイプミスされた) オプションを黙って無視していたバグ (GH 19303)

  • DataFrame.groupby() で、タプルがキーではなくキーのリストとして解釈されていたバグ (GH 17979, GH 18249)

  • DataFrame.groupby() で、first/last/min/max による集約がタイムスタンプの精度を失わせていたバグ (GH 19526)

  • DataFrame.transform() で、特定の集約関数がグループ化されたデータの dtype に一致するように誤ってキャストされていたバグ (GH 19200)

  • DataFrame.groupby()on= kwarg を渡し、その後に .apply() を使用する際のバグ (GH 17813)

  • DataFrame.resample().aggregate で、存在しない列を集約する際に KeyError が発生しなかったバグ (GH 16766, GH 19566)

  • skipna が渡された場合の DataFrameGroupBy.cumsum() および DataFrameGroupBy.cumprod() のバグ (GH 19806)

  • DataFrame.resample() がタイムゾーン情報を削除していたバグ (GH 13238)

  • DataFrame.groupby() で、np.all および np.any を使用する変換が ValueError を発生させていたバグ (GH 20653)

  • DataFrame.resample() で、ffillbfillpadbackfillfillnainterpolate、および asfreqloffset を無視していたバグ (GH 20744)

  • DataFrame.groupby() で、混合データ型を持つ関数を適用し、ユーザーが指定した関数がグループ化列で失敗する可能性があったバグ (GH 20949)

  • DataFrameGroupBy.rolling().apply() で、関連する DataFrameGroupBy オブジェクトに対して実行された操作が、結果へのグループ化されたアイテムの包含に影響を与える可能性があったバグ (GH 14013)

スパース#

  • 密な Series またはサポートされていない型から SparseDataFrame を作成すると、制御不能な例外が発生していたバグ (GH 19374)

  • SparseDataFrame.to_csv で例外が発生するバグ (GH 19384)

  • SparseSeries.memory_usage で、非疎要素にアクセスすることでセグメンテーション違反が発生していたバグ (GH 19368)

  • SparseArray の構築におけるバグ: data がスカラで index が定義されている場合、スカラの dtype に関係なく float64 に強制されます (GH 19163)

再整形#

  • DataFrame.merge() で、CategoricalIndex を名前で参照し、by kwarg が KeyError を発生させていたバグ (GH 20777)

  • DataFrame.stack() が Python 3 で混合型のレベルをソートしようとして失敗するバグ (GH 18310)

  • columns が未使用レベルの MultiIndex の場合、int を float にキャストする DataFrame.unstack() のバグ (GH 17845)

  • index がアンスタックされたレベルで未使用ラベルを持つ MultiIndex の場合、エラーが発生する DataFrame.unstack() のバグ (GH 18562)

  • NaN をキーとして含む dict から Series を構築する際の修正 (GH 18480)

  • NaN をキーとして含む dict から DataFrame を構築する際の修正 (GH 18455)

  • len(index) > len(data) = 1 の Series の構築を無効にしました。以前はデータ項目をブロードキャストしていましたが、現在は ValueError が発生します (GH 18819)

  • 対応するキーが渡されたインデックスに含まれていない場合に、スカラー値を含む dict から DataFrame を構築する際のエラーを抑制しました (GH 18600)

  • 軸、データなし、dtype=int で初期化された DataFrame の dtype を修正しました (object から float64 に変更) (GH 19646)

  • NaT を含む SeriesSeries をインプレースで変更する Series.rank() のバグ (GH 18521)

  • 読み取り専用配列を使用すると失敗する cut() のバグ (GH 18773)

  • aggfunc 引数が文字列型の場合に失敗する DataFrame.pivot_table() のバグ。動作は aggapply などの他のメソッドと整合性が取れるようになりました (GH 18713)

  • Index オブジェクトをベクトルとして使用してマージすると例外が発生する DataFrame.merge() のバグ (GH 19038)

  • サブクラスを返していなかった DataFrame.stack(), DataFrame.unstack(), Series.unstack() のバグ (GH 15563)

  • タイムゾーン比較のバグで、.concat() でインデックスが UTC に変換される形で現れていました (GH 18523)

  • スパースシリーズと密シリーズを連結する際に SparseDataFrame のみを返す concat() のバグ。DataFrame であるべきです。 (GH 18914, GH 18686, および GH 16874)

  • 共通のマージキーがない場合の DataFrame.merge() のエラーメッセージを改善しました (GH 19427)

  • 複数の DataFrame で呼び出され、一部に一意でないインデックスがある場合に、left join の代わりに outer join を行う DataFrame.join() のバグ (GH 19624)

  • Series.rename()axis を kwarg として受け入れるようになりました (GH 18589)

  • 同じ長さのタプルのインデックスが MultiIndex に変換される rename() のバグ (GH 19497)

  • SeriesIndex の比較で、Index の名前属性を無視して、誤った名前を持つ Series が返されるというバグ (GH 19582)

  • NaT が存在する datetime および timedelta データで ValueError が発生する qcut() のバグ (GH 19768)

  • ISO8601 に準拠していない文字列を datetime として推論する DataFrame.iterrows() のバグ (GH 19671)

  • Categorical を伴う Series コンストラクターで、異なる長さのインデックスが与えられた場合に ValueError が発生しないバグ (GH 19342)

  • カテゴリカルまたは dtype の辞書に変換する際に、列のメタデータが失われる DataFrame.astype() のバグ (GH 19920)

  • タイムゾーン情報が失われる cut() および qcut() のバグ (GH 19872)

  • dtype=str を伴う Series コンストラクターのバグで、以前は一部のケースで発生していました (GH 19853)

  • 重複する列名が誤った動作を引き起こす get_dummies() および select_dtypes() のバグ (GH 20848)

  • 曖昧な型のリストを処理できない isna() のバグ (GH 20675)

  • TZ対応のデータフレームと全NaTデータフレームを連結する際にエラーが発生する concat() のバグ (GH 12396)

  • 空のTZ対応シリーズを連結する際にエラーが発生する concat() のバグ (GH 18447)

その他#

  • numexpr を使用したクエリで Python のキーワードを識別子として使用しようとした際のエラーメッセージを改善しました (GH 18221)

  • pandas.get_option() にアクセスする際のバグで、一部のケースで存在しないオプションキーを探す際に OptionError ではなく KeyError を発生させていました (GH 19789)

  • 異なるユニコードデータを持つ Series または DataFrame の testing.assert_series_equal() および testing.assert_frame_equal() のバグ (GH 20503)

貢献者#

このリリースには合計328名がパッチを貢献しました。名前に「+」が付いている方は、初めてパッチを貢献された方です。

  • Aaron Critchley

  • AbdealiJK +

  • Adam Hooper +

  • アルバート・ビラノバ・デル・モラル

  • Alejandro Giacometti +

  • Alejandro Hohmann +

  • Alex Rychyk

  • Alexander Buchkovsky

  • Alexander Lenail +

  • Alexander Michael Schade

  • Aly Sivji +

  • Andreas Költringer +

  • Andrew

  • Andrew Bui +

  • András Novoszáth +

  • Andy Craze +

  • Andy R. Terrel

  • Anh Le +

  • Anil Kumar Pallekonda +

  • Antoine Pitrou +

  • Antonio Linde +

  • Antonio Molina +

  • Antonio Quinonez +

  • Armin Varshokar +

  • Artem Bogachev +

  • Avi Sen +

  • Azeez Oluwafemi +

  • Ben Auffarth +

  • Bernhard Thiel +

  • Bhavesh Poddar +

  • BielStela +

  • Blair +

  • Bob Haffner

  • Brett Naul +

  • Brock Mendel

  • Bryce Guinta +

  • Carlos Eduardo Moreira dos Santos +

  • Carlos García Márquez +

  • Carol Willing

  • Cheuk Ting Ho +

  • Chitrank Dixit +

  • Chris

  • Chris Burr +

  • Chris Catalfo +

  • Chris Mazzullo

  • Christian Chwala +

  • Cihan Ceyhan +

  • Clemens Brunner

  • Colin +

  • Cornelius Riemenschneider

  • Crystal Gong +

  • DaanVanHauwermeiren

  • Dan Dixey +

  • Daniel Frank +

  • Daniel Garrido +

  • Daniel Sakuma +

  • DataOmbudsman +

  • Dave Hirschfeld

  • Dave Lewis +

  • David Adrián Cañones Castellano +

  • David Arcos +

  • David C Hall +

  • David Fischer

  • David Hoese +

  • David Lutz +

  • David Polo +

  • David Stansby

  • Dennis Kamau +

  • Dillon Niederhut

  • Dimitri +

  • Dr. Irv

  • Dror Atariah

  • Eric Chea +

  • Eric Kisslinger

  • Eric O. LEBIGOT (EOL) +

  • FAN-GOD +

  • Fabian Retkowski +

  • Fer Sar +

  • Gabriel de Maeztu +

  • Gianpaolo Macario +

  • Giftlin Rajaiah

  • Gilberto Olimpio +

  • Gina +

  • Gjelt +

  • Graham Inggs +

  • Grant Roch

  • Grant Smith +

  • Grzegorz Konefał +

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

  • HagaiHargil +

  • Hamish Pitkeathly +

  • Hammad Mashkoor +

  • Hannah Ferchland +

  • ハンス

  • Haochen Wu +

  • Hissashi Rocha +

  • Iain Barr +

  • Ibrahim Sharaf ElDen +

  • Ignasi Fosch +

  • Igor Conrado Alves de Lima +

  • Igor Shelvinskyi +

  • Imanflow +

  • Ingolf Becker

  • Israel Saeta Pérez

  • Iva Koevska +

  • Jakub Nowacki +

  • Jan F-F +

  • Jan Koch +

  • Jan Werkmann

  • Janelle Zoutkamp +

  • Jason Bandlow +

  • Jaume Bonet +

  • Jay Alammar +

  • ジェフ・リーバック

  • JennaVergeynst

  • Jimmy Woo +

  • Jing Qiang Goh +

  • Joachim Wagner +

  • Joan Martin Miralles +

  • Joel Nothman

  • Joeun Park +

  • John Cant +

  • Johnny Metz +

  • Jon Mease

  • Jonas Schulze +

  • Jongwony +

  • Jordi Contestí +

  • Joris Van den Bossche

  • José F. R. Fonseca +

  • Jovixe +

  • Julio Martinez +

  • Jörg Döpfert

  • KOBAYASHI Ittoku +

  • Kate Surta +

  • Kenneth +

  • Kevin Kuhl

  • ケビン・シェパード

  • Krzysztof Chomski

  • Ksenia +

  • Ksenia Bobrova +

  • Kunal Gosar +

  • Kurtis Kerstein +

  • Kyle Barron +

  • Laksh Arora +

  • Laurens Geffert +

  • Leif Walsh

  • Liam Marshall +

  • Liam3851 +

  • Licht Takeuchi

  • Liudmila +

  • Ludovico Russo +

  • Mabel Villalba +

  • Manan Pal Singh +

  • Manraj Singh

  • Marc +

  • Marc Garcia

  • Marco Hemken +

  • Maria del Mar Bibiloni +

  • Mario Corchero +

  • Mark Woodbridge +

  • Martin Journois +

  • Mason Gallo +

  • Matias Heikkilä +

  • Matt Braymer-Hayes

  • Matt Kirk +

  • Matt Maybeno +

  • Matthew Kirk +

  • Matthew Rocklin +

  • Matthew Roeschke

  • Matthias Bussonnier +

  • Max Mikhaylov +

  • Maxim Veksler +

  • Maximilian Roos

  • Maximiliano Greco +

  • Michael Penkov

  • Michael Röttger +

  • Michael Selik +

  • Michael Waskom

  • Mie~~~

  • Mike Kutzma +

  • Ming Li +

  • Mitar +

  • Mitch Negus +

  • Montana Low +

  • Moritz Münst +

  • モルタダ・メヒヤル

  • Myles Braithwaite +

  • Nate Yoder

  • Nicholas Ursa +

  • Nick Chmura

  • Nikos Karagiannakis +

  • Nipun Sadvilkar +

  • Nis Martensen +

  • Noah +

  • Noémi Éltető +

  • Olivier Bilodeau +

  • Ondrej Kokes +

  • Onno Eberhard +

  • Paul Ganssle +

  • Paul Mannino +

  • Paul Reidy

  • Paulo Roberto de Oliveira Castro +

  • Pepe Flores +

  • Peter Hoffmann

  • Phil Ngo +

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

  • Pranav Suri +

  • Priyanka Ojha +

  • Pulkit Maloo +

  • README Bot +

  • Ray Bell +

  • Riccardo Magliocchetti +

  • Ridhwan Luthra +

  • Robert Meyer

  • Robin

  • Robin Kiplang’at +

  • Rohan Pandit +

  • Rok Mihevc +

  • Rouz Azari

  • Ryszard T. Kaleta +

  • Sam Cohan

  • Sam Foo

  • Samir Musali +

  • Samuel Sinayoko +

  • Sangwoong Yoon

  • SarahJessica +

  • Sharad Vijalapuram +

  • Shubham Chaudhary +

  • SiYoungOh +

  • Sietse Brouwer

  • Simone Basso +

  • Stefania Delprete +

  • Stefano Cianciulli +

  • Stephen Childs +

  • StephenVoland +

  • Stijn Van Hoey +

  • スヴェン

  • Talitha Pumar +

  • Tarbo Fukazawa +

  • Ted Petrou +

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

  • Tim Hoffmann +

  • Tim Swast

  • Tom Augspurger

  • Tommy +

  • Tulio Casagrande +

  • Tushar Gupta +

  • Tushar Mittal +

  • Upkar Lidder +

  • Victor Villas +

  • Vince W +

  • Vinícius Figueiredo +

  • Vipin Kumar +

  • WBare

  • Wenhuan +

  • ウェス・ターナー

  • ウィリアム・エイド

  • Wilson Lin +

  • Xbar

  • ヤロスラフ・ハルチェンコ

  • Yee Mey

  • Yeongseon Choe +

  • Yian +

  • Yimeng Zhang

  • ZhuBaohe +

  • Zihao Zhao +

  • adatasetaday +

  • akielbowicz +

  • akosel +

  • alinde1 +

  • amuta +

  • bolkedebruin

  • cbertinato

  • cgohlke

  • charlie0389 +

  • クリス・B1

  • csfarkas +

  • dajcs +

  • deflatSOCO +

  • derestle-htwg

  • discort

  • dmanikowski-reef +

  • donK23 +

  • elrubio +

  • fivemok +

  • fjdiod

  • fjetter +

  • froessler +

  • gabrielclow

  • ジーエフヤング

  • ghasemnaddaf

  • h-vetinari +

  • himanshu awasthi +

  • ignamv +

  • jayfoad +

  • jazzmuesli +

  • jbrockmendel

  • jen w +

  • jjames34 +

  • joaoavf +

  • joders +

  • jschendel

  • juan huguet +

  • l736x +

  • luzpaz +

  • mdeboc +

  • miguelmorin +

  • miker985

  • miquelcamprodon +

  • orereta +

  • ottiP +

  • peterpanmj +

  • rafarui +

  • raph-m +

  • readyready15728 +

  • rmihael +

  • samghelms +

  • scriptomation +

  • sfoo +

  • stefansimik +

  • stonebig

  • tmnhat2001 +

  • tomneep +

  • topper-123

  • tv3141 +

  • verakai +

  • xpvpc +

  • zhanghui +