0.24.0 の新機能 (2019年1月25日)#

警告

0.24.x 系列のリリースは、Python 2 をサポートする最後のリリースとなります。今後の機能リリースは、Python 3 のみをサポートします。詳細については、Python 2.7 のサポート終了を参照してください。

これは 0.23.4 からのメジャーリリースで、多数のバグ修正に加え、API の変更、新機能、機能強化、パフォーマンス改善が含まれています。

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

更新する前に、API の変更非推奨化を確認してください。

これらは pandas 0.24.0 の変更点です。他のバージョンの pandas を含む完全な変更ログについては、リリースノートを参照してください。

機能強化#

オプションの整数 NA サポート#

pandas は、欠損値を持つ整数 dtype を保持する機能を追加しました。この長らく要望されていた機能は、拡張型を使用することで可能になります。

IntegerArray は現在実験中です。その API または実装は予告なく変更される可能性があります。

指定された dtype でSeriesを構築できます。dtype 文字列Int64は pandas ExtensionDtypeです。従来の欠損値マーカーであるnp.nanを使用してリストまたは配列を指定すると、整数 dtype に推論されます。Seriesの表示も、文字列出力で欠損値を示すためにNaNを使用します。( GH 20700GH 20747GH 22441GH 21789GH 22346)

In [1]: s = pd.Series([1, 2, np.nan], dtype='Int64')

In [2]: s
Out[2]: 
0       1
1       2
2    <NA>
Length: 3, dtype: Int64

これらの dtype の操作は、他の pandas の操作と同様にNaNを伝播します。

# arithmetic
In [3]: s + 1
Out[3]: 
0       2
1       3
2    <NA>
Length: 3, dtype: Int64

# comparison
In [4]: s == 1
Out[4]: 
0     True
1    False
2     <NA>
Length: 3, dtype: boolean

# indexing
In [5]: s.iloc[1:3]
Out[5]: 
1       2
2    <NA>
Length: 2, dtype: Int64

# operate with other dtypes
In [6]: s + s.iloc[1:3].astype('Int8')
Out[6]: 
0    <NA>
1       4
2    <NA>
Length: 3, dtype: Int64

# coerce when needed
In [7]: s + 0.01
Out[7]: 
0    1.01
1    2.01
2    <NA>
Length: 3, dtype: Float64

これらの dtype はDataFrameの一部として操作できます。

In [8]: df = pd.DataFrame({'A': s, 'B': [1, 1, 3], 'C': list('aab')})

In [9]: df
Out[9]: 
      A  B  C
0     1  1  a
1     2  1  a
2  <NA>  3  b

[3 rows x 3 columns]

In [10]: df.dtypes
Out[10]: 
A     Int64
B     int64
C    object
Length: 3, dtype: object

これらの dtype はマージ、再整形、キャストが可能です。

In [11]: pd.concat([df[['A']], df[['B', 'C']]], axis=1).dtypes
Out[11]: 
A     Int64
B     int64
C    object
Length: 3, dtype: object

In [12]: df['A'].astype(float)
Out[12]: 
0    1.0
1    2.0
2    NaN
Name: A, Length: 3, dtype: float64

sumなどの縮約およびグループ化操作は機能します。

In [13]: df.sum()
Out[13]: 
A      3
B      5
C    aab
Length: 3, dtype: object

In [14]: df.groupby('B').A.sum()
Out[14]: 
B
1    3
3    0
Name: A, Length: 2, dtype: Int64

警告

現在の Integer NA サポートでは、従来のint8と比較して、Int8のように大文字の dtype バージョンを使用しています。これは将来変更される可能性があります。

詳細については、Nullable 整数データ型を参照してください。

Series または Index の値へのアクセス#

Series.arrayIndex.arrayが、SeriesまたはIndexの基になる配列を抽出するために追加されました。( GH 19954GH 23623)

In [15]: idx = pd.period_range('2000', periods=4)

In [16]: idx.array
Out[16]: 
<PeriodArray>
['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04']
Length: 4, dtype: period[D]

In [17]: pd.Series(idx).array
Out[17]: 
<PeriodArray>
['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04']
Length: 4, dtype: period[D]

歴史的に、これはseries.valuesで行われていましたが、.valuesでは、返される値が実際の配列であるのか、その何らかの変換であるのか、または pandas のカスタム配列 (例: Categorical) のいずれであるのかが不明瞭でした。たとえば、PeriodIndexの場合、.valuesは毎回 period オブジェクトの新しい ndarray を生成します。

In [18]: idx.values
Out[18]: 
array([Period('2000-01-01', 'D'), Period('2000-01-02', 'D'),
       Period('2000-01-03', 'D'), Period('2000-01-04', 'D')], dtype=object)

In [19]: id(idx.values)
Out[19]: 140274320467376

In [20]: id(idx.values)
Out[20]: 140274716206992

実際の NumPy 配列が必要な場合は、Series.to_numpy()またはIndex.to_numpy()を使用してください。

In [21]: idx.to_numpy()
Out[21]: 
array([Period('2000-01-01', 'D'), Period('2000-01-02', 'D'),
       Period('2000-01-03', 'D'), Period('2000-01-04', 'D')], dtype=object)

In [22]: pd.Series(idx).to_numpy()
Out[22]: 
array([Period('2000-01-01', 'D'), Period('2000-01-02', 'D'),
       Period('2000-01-03', 'D'), Period('2000-01-04', 'D')], dtype=object)

通常の NumPy 配列によってバックアップされている Series および Index の場合、Series.arrayは新しいarrays.PandasArrayを返します。これは、numpy.ndarrayを薄く (コピーなしで) ラップしたものです。PandasArrayはそれ自体では特に有用ではありませんが、pandas またはサードパーティライブラリで定義されている拡張配列と同じインターフェースを提供します。

In [23]: ser = pd.Series([1, 2, 3])

In [24]: ser.array
Out[24]: 
<NumpyExtensionArray>
[1, 2, 3]
Length: 3, dtype: int64

In [25]: ser.to_numpy()
Out[25]: array([1, 2, 3])

Series.valuesまたはDataFrame.valuesを削除または非推奨化していませんが、代わりに.arrayまたは.to_numpy()を使用することを強くお勧めします。

詳細については、DtypesおよびAttributes and Underlying Dataを参照してください。

pandas.array: 配列を作成するための新しいトップレベルメソッド#

1次元配列を作成するための新しいトップレベルメソッドarray()が追加されました(GH 22860)。これは、サードパーティライブラリによって登録された拡張配列を含む、任意の拡張配列を作成するために使用できます。拡張配列の詳細については、dtypes ドキュメントを参照してください。

In [26]: pd.array([1, 2, np.nan], dtype='Int64')
Out[26]: 
<IntegerArray>
[1, 2, <NA>]
Length: 3, dtype: Int64

In [27]: pd.array(['a', 'b', 'c'], dtype='category')
Out[27]: 
['a', 'b', 'c']
Categories (3, object): ['a', 'b', 'c']

専用の拡張型がないデータ (例: float、integer など) を渡すと、新しいarrays.PandasArrayが返されます。これは、pandas 拡張配列インターフェースを満たす、numpy.ndarrayの薄い (コピーなしの) ラッパーです。

In [28]: pd.array([1, 2, 3])
Out[28]: 
<IntegerArray>
[1, 2, 3]
Length: 3, dtype: Int64

それ自体では、PandasArrayは非常に便利なオブジェクトではありません。しかし、任意のExtensionArrayに対して汎用的に機能する低レベルコードを記述する必要がある場合、PandasArrayはそのニーズを満たします。

デフォルトでは、dtypeが指定されていない場合、返される配列の dtype はデータから推論されることに注意してください。特に、最初の例の[1, 2, np.nan]は、NaNが浮動小数点であるため、浮動小数点配列を返したことに注意してください。

In [29]: pd.array([1, 2, np.nan])
Out[29]: 
<IntegerArray>
[1, 2, <NA>]
Length: 3, dtype: Int64

Interval と Period データを Series と DataFrame に保存する#

IntervalPeriodデータは、以前と同様にIntervalIndexおよびPeriodIndexに加えて、SeriesまたはDataFrameに保存できるようになりました。( GH 19453GH 22862)

In [30]: ser = pd.Series(pd.interval_range(0, 5))

In [31]: ser
Out[31]: 
0    (0, 1]
1    (1, 2]
2    (2, 3]
3    (3, 4]
4    (4, 5]
Length: 5, dtype: interval

In [32]: ser.dtype
Out[32]: interval[int64, right]

期間の場合

In [33]: pser = pd.Series(pd.period_range("2000", freq="D", periods=5))

In [34]: pser
Out[34]: 
0    2000-01-01
1    2000-01-02
2    2000-01-03
3    2000-01-04
4    2000-01-05
Length: 5, dtype: period[D]

In [35]: pser.dtype
Out[35]: period[D]

以前は、これらはオブジェクト dtype の NumPy 配列にキャストされていました。一般的に、これにより、Interval または Period の配列をSeriesまたはDataFrameの列に格納する際のパフォーマンスが向上するはずです。

SeriesからIntervalまたはPeriodの基になる配列を抽出するには、Series.arrayを使用します。

In [36]: ser.array
Out[36]: 
<IntervalArray>
[(0, 1], (1, 2], (2, 3], (3, 4], (4, 5]]
Length: 5, dtype: interval[int64, right]

In [37]: pser.array
Out[37]: 
<PeriodArray>
['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04', '2000-01-05']
Length: 5, dtype: period[D]

これらは、Interval および Period データをバックアップする新しい拡張配列であるarrays.IntervalArrayまたはarrays.PeriodArrayのインスタンスを返します。

警告

後方互換性のために、Series.valuesは Interval および Period データに対してオブジェクトの NumPy 配列を返し続けます。Seriesに格納されているデータの配列が必要な場合はSeries.arrayを使用し、NumPy 配列が必要であることがわかっている場合はSeries.to_numpy()を使用することをお勧めします。

詳細については、DtypesおよびAttributes and Underlying Dataを参照してください。

2つのマルチインデックスで結合する#

DataFrame.merge()DataFrame.join()は、重複するインデックスレベルでマルチインデックスDataframeインスタンスを結合するために使用できるようになりました。( GH 6360)

マージ、結合、連結のドキュメントセクションを参照してください。

In [38]: index_left = pd.MultiIndex.from_tuples([('K0', 'X0'), ('K0', 'X1'),
   ....:                                        ('K1', 'X2')],
   ....:                                        names=['key', 'X'])
   ....: 

In [39]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
   ....:                      'B': ['B0', 'B1', 'B2']}, index=index_left)
   ....: 

In [40]: index_right = pd.MultiIndex.from_tuples([('K0', 'Y0'), ('K1', 'Y1'),
   ....:                                         ('K2', 'Y2'), ('K2', 'Y3')],
   ....:                                         names=['key', 'Y'])
   ....: 

In [41]: right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
   ....:                       'D': ['D0', 'D1', 'D2', 'D3']}, index=index_right)
   ....: 

In [42]: left.join(right)
Out[42]: 
            A   B   C   D
key X  Y                 
K0  X0 Y0  A0  B0  C0  D0
    X1 Y0  A1  B1  C0  D0
K1  X2 Y1  A2  B2  C1  D1

[3 rows x 4 columns]

以前のバージョンでは、以下を使用してこれを行うことができました。

In [43]: pd.merge(left.reset_index(), right.reset_index(),
   ....:          on=['key'], how='inner').set_index(['key', 'X', 'Y'])
   ....: 
Out[43]: 
            A   B   C   D
key X  Y                 
K0  X0 Y0  A0  B0  C0  D0
    X1 Y0  A1  B1  C0  D0
K1  X2 Y1  A2  B2  C1  D1

[3 rows x 4 columns]

関数read_htmlの機能強化#

read_html()は以前、colspanおよびrowspan属性を無視していました。現在ではそれらを理解し、同じ値を持つセルのシーケンスとして扱います。( GH 17054)

In [44]: from io import StringIO

In [45]: result = pd.read_html(StringIO("""
   ....:   <table>
   ....:     <thead>
   ....:       <tr>
   ....:         <th>A</th><th>B</th><th>C</th>
   ....:       </tr>
   ....:     </thead>
   ....:     <tbody>
   ....:       <tr>
   ....:         <td colspan="2">1</td><td>2</td>
   ....:       </tr>
   ....:     </tbody>
   ....:   </table>"""))
   ....: 

以前の動作:

In [13]: result
Out [13]:
[   A  B   C
 0  1  2 NaN]

新しい動作:

In [46]: result
Out[46]: 
[   A  B  C
 0  1  1  2
 
 [1 rows x 3 columns]]

新しいStyler.pipe()メソッド#

Stylerクラスにpipe()メソッドが追加されました。これにより、ユーザーが定義したスタイリング関数を適用するための便利な方法が提供され、ノートブック内で DataFrame のスタイリング機能を繰り返し使用する際の「ボイラープレート」を削減するのに役立ちます。( GH 23229)

In [47]: df = pd.DataFrame({'N': [1250, 1500, 1750], 'X': [0.25, 0.35, 0.50]})

In [48]: def format_and_align(styler):
   ....:     return (styler.format({'N': '{:,}', 'X': '{:.1%}'})
   ....:                   .set_properties(**{'text-align': 'right'}))
   ....: 

In [49]: df.style.pipe(format_and_align).set_caption('Summary of results.')
Out[49]: <pandas.io.formats.style.Styler at 0x7f9425e40c40>

同様のメソッドは、DataFrame.pipe()GroupBy.pipe()Resampler.pipe()など、pandas の他のクラスにもすでに存在します。

MultiIndex の名前を変更する#

DataFrame.rename_axis()indexおよびcolumns引数をサポートし、Series.rename_axis()index引数をサポートするようになりました ( GH 19978)。

この変更により、辞書を渡してMultiIndexの一部を名前変更できるようになりました。

In [50]: mi = pd.MultiIndex.from_product([list('AB'), list('CD'), list('EF')],
   ....:                                 names=['AB', 'CD', 'EF'])
   ....: 

In [51]: df = pd.DataFrame(list(range(len(mi))), index=mi, columns=['N'])

In [52]: df
Out[52]: 
          N
AB CD EF   
A  C  E   0
      F   1
   D  E   2
      F   3
B  C  E   4
      F   5
   D  E   6
      F   7

[8 rows x 1 columns]

In [53]: df.rename_axis(index={'CD': 'New'})
Out[53]: 
           N
AB New EF   
A  C   E   0
       F   1
   D   E   2
       F   3
B  C   E   4
       F   5
   D   E   6
       F   7

[8 rows x 1 columns]

詳細については、名前変更に関する詳細ドキュメントを参照してください。

その他の機能強化#

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

pandas 0.24.0 には、多くの API の破壊的変更が含まれています。

依存関係の最小バージョン引き上げ#

依存関係の最小サポートバージョンを更新しました ( GH 21242GH 18742GH 23774GH 24767)。インストールされている場合、次のものが必要になります。

パッケージ

最小バージョン

必須

numpy

1.12.0

X

bottleneck

1.2.0

fastparquet

0.2.1

matplotlib

2.0.0

numexpr

2.6.1

pandas-gbq

0.8.0

pyarrow

0.9.0

pytables

3.4.2

scipy

0.18.1

xlrd

1.0.0

pytest (開発)

3.6

さらに、feather ベースのストレージにfeather-formatに依存しなくなり、代わりにpyarrowへの参照に置き換えられました ( GH 21639およびGH 23053)。

DataFrame.to_csvline_terminatoros.linesepが使用される#

DataFrame.to_csv()は、デフォルトの行末記号として'\n'ではなくos.linesep()を使用するようになりました (GH 20353)。この変更は、Windows で実行した場合にのみ影響し、line_terminator'\n'が渡されていても行末記号として'\r\n'が使用されていました。

Windows 上での以前の動作

In [1]: data = pd.DataFrame({"string_with_lf": ["a\nbc"],
   ...:                      "string_with_crlf": ["a\r\nbc"]})

In [2]: # When passing file PATH to to_csv,
   ...: # line_terminator does not work, and csv is saved with '\r\n'.
   ...: # Also, this converts all '\n's in the data to '\r\n'.
   ...: data.to_csv("test.csv", index=False, line_terminator='\n')

In [3]: with open("test.csv", mode='rb') as f:
   ...:     print(f.read())
Out[3]: b'string_with_lf,string_with_crlf\r\n"a\r\nbc","a\r\r\nbc"\r\n'

In [4]: # When passing file OBJECT with newline option to
   ...: # to_csv, line_terminator works.
   ...: with open("test2.csv", mode='w', newline='\n') as f:
   ...:     data.to_csv(f, index=False, line_terminator='\n')

In [5]: with open("test2.csv", mode='rb') as f:
   ...:     print(f.read())
Out[5]: b'string_with_lf,string_with_crlf\n"a\nbc","a\r\nbc"\n'

Windows 上での新しい動作

line_terminatorを明示的に渡すと、line terminatorはその文字に設定されます。

In [1]: data = pd.DataFrame({"string_with_lf": ["a\nbc"],
   ...:                      "string_with_crlf": ["a\r\nbc"]})

In [2]: data.to_csv("test.csv", index=False, line_terminator='\n')

In [3]: with open("test.csv", mode='rb') as f:
   ...:     print(f.read())
Out[3]: b'string_with_lf,string_with_crlf\n"a\nbc","a\r\nbc"\n'

Windowsでは、os.linesepの値は'\r\n'であるため、line_terminatorが設定されていない場合は、行末記号として'\r\n'が使用されます。

In [1]: data = pd.DataFrame({"string_with_lf": ["a\nbc"],
   ...:                      "string_with_crlf": ["a\r\nbc"]})

In [2]: data.to_csv("test.csv", index=False)

In [3]: with open("test.csv", mode='rb') as f:
   ...:     print(f.read())
Out[3]: b'string_with_lf,string_with_crlf\r\n"a\nbc","a\r\nbc"\r\n'

ファイルオブジェクトの場合、newlineを指定するだけでは行末記号を設定するには不十分です。この場合でも、line_terminatorを明示的に渡す必要があります。

In [1]: data = pd.DataFrame({"string_with_lf": ["a\nbc"],
   ...:                      "string_with_crlf": ["a\r\nbc"]})

In [2]: with open("test2.csv", mode='w', newline='\n') as f:
   ...:     data.to_csv(f, index=False)

In [3]: with open("test2.csv", mode='rb') as f:
   ...:     print(f.read())
Out[3]: b'string_with_lf,string_with_crlf\r\n"a\nbc","a\r\nbc"\r\n'

Python エンジンを使用する文字列データ型列でのnp.nanの適切な処理#

Python エンジンを使用するread_excel()read_csv()にはバグがあり、dtype=strna_filter=Trueの場合に欠損値が'nan'に変換されていました。現在では、これらの欠損値は文字列欠損インジケーターであるnp.nanに変換されます。( GH 20377)

以前の動作:

In [5]: data = 'a,b,c\n1,,3\n4,5,6'
In [6]: df = pd.read_csv(StringIO(data), engine='python', dtype=str, na_filter=True)
In [7]: df.loc[0, 'b']
Out[7]:
'nan'

新しい動作:

In [54]: data = 'a,b,c\n1,,3\n4,5,6'

In [55]: df = pd.read_csv(StringIO(data), engine='python', dtype=str, na_filter=True)

In [56]: df.loc[0, 'b']
Out[56]: nan

文字列化された形式ではなく、np.nan自体を出力するようになりました。

タイムゾーンオフセットを含む datetime 文字列の解析#

以前は、to_datetime()またはDatetimeIndexで UTC オフセットを持つ datetime 文字列を解析すると、タイムゾーンローカライズなしで datetime を自動的に UTC に変換していました。これは、Timestampで同じ datetime 文字列を解析すると、tz属性に UTC オフセットが保持されるのと矛盾していました。現在、to_datetime()は、すべての datetime 文字列が同じ UTC オフセットを持つ場合、tz属性に UTC オフセットを保持します ( GH 17697GH 11736GH 22457)

以前の動作:

In [2]: pd.to_datetime("2015-11-18 15:30:00+05:30")
Out[2]: Timestamp('2015-11-18 10:00:00')

In [3]: pd.Timestamp("2015-11-18 15:30:00+05:30")
Out[3]: Timestamp('2015-11-18 15:30:00+0530', tz='pytz.FixedOffset(330)')

# Different UTC offsets would automatically convert the datetimes to UTC (without a UTC timezone)
In [4]: pd.to_datetime(["2015-11-18 15:30:00+05:30", "2015-11-18 16:30:00+06:30"])
Out[4]: DatetimeIndex(['2015-11-18 10:00:00', '2015-11-18 10:00:00'], dtype='datetime64[ns]', freq=None)

新しい動作:

In [57]: pd.to_datetime("2015-11-18 15:30:00+05:30")
Out[57]: Timestamp('2015-11-18 15:30:00+0530', tz='UTC+05:30')

In [58]: pd.Timestamp("2015-11-18 15:30:00+05:30")
Out[58]: Timestamp('2015-11-18 15:30:00+0530', tz='UTC+05:30')

同じUTCオフセットを持つdatetime文字列を解析すると、UTCオフセットがtzに保持されます。

In [59]: pd.to_datetime(["2015-11-18 15:30:00+05:30"] * 2)
Out[59]: DatetimeIndex(['2015-11-18 15:30:00+05:30', '2015-11-18 15:30:00+05:30'], dtype='datetime64[ns, UTC+05:30]', freq=None)

異なるUTCオフセットを持つdatetime文字列を解析すると、異なるUTCオフセットを持つdatetime.datetimeオブジェクトのIndexが作成されるようになりました。

In [59]: idx = pd.to_datetime(["2015-11-18 15:30:00+05:30",
                               "2015-11-18 16:30:00+06:30"])

In[60]: idx
Out[60]: Index([2015-11-18 15:30:00+05:30, 2015-11-18 16:30:00+06:30], dtype='object')

In[61]: idx[0]
Out[61]: Timestamp('2015-11-18 15:30:00+0530', tz='UTC+05:30')

In[62]: idx[1]
Out[62]: Timestamp('2015-11-18 16:30:00+0630', tz='UTC+06:30')

utc=Trueを渡すと、以前の動作を模倣しますが、日付がUTCに変換されたことを正しく示します。

In [60]: pd.to_datetime(["2015-11-18 15:30:00+05:30",
   ....:                 "2015-11-18 16:30:00+06:30"], utc=True)
   ....: 
Out[60]: DatetimeIndex(['2015-11-18 10:00:00+00:00', '2015-11-18 10:00:00+00:00'], dtype='datetime64[ns, UTC]', freq=None)

read_csv()で混在タイムゾーンを解析する#

read_csv()は、混在タイムゾーンの列を黙って UTC に変換しなくなりました (GH 24987)。

以前の動作

>>> import io
>>> content = """\
... a
... 2000-01-01T00:00:00+05:00
... 2000-01-01T00:00:00+06:00"""
>>> df = pd.read_csv(io.StringIO(content), parse_dates=['a'])
>>> df.a
0   1999-12-31 19:00:00
1   1999-12-31 18:00:00
Name: a, dtype: datetime64[ns]

新しい動作

In[64]: import io

In[65]: content = """\
   ...: a
   ...: 2000-01-01T00:00:00+05:00
   ...: 2000-01-01T00:00:00+06:00"""

In[66]: df = pd.read_csv(io.StringIO(content), parse_dates=['a'])

In[67]: df.a
Out[67]:
0   2000-01-01 00:00:00+05:00
1   2000-01-01 00:00:00+06:00
Name: a, Length: 2, dtype: object

ご覧のとおり、dtypeはオブジェクトであり、列の各値は文字列です。文字列を datetime の配列に変換するには、date_parser引数

In [3]: df = pd.read_csv(
   ...:     io.StringIO(content),
   ...:     parse_dates=['a'],
   ...:     date_parser=lambda col: pd.to_datetime(col, utc=True),
   ...: )

In [4]: df.a
Out[4]:
0   1999-12-31 19:00:00+00:00
1   1999-12-31 18:00:00+00:00
Name: a, dtype: datetime64[ns, UTC]

詳細については、タイムゾーンオフセットを含む datetime 文字列の解析を参照してください。

dt.end_timeto_timestamp(how='end')の時間値#

PeriodおよびPeriodIndexオブジェクトの時間値は、Series.dt.end_timePeriod.end_timePeriodIndex.end_timePeriod.to_timestamp()how='end'で呼び出すか、PeriodIndex.to_timestamp()how='end'で呼び出すと、「23:59:59.999999999」に設定されるようになりました (GH 17157)

以前の動作:

In [2]: p = pd.Period('2017-01-01', 'D')
In [3]: pi = pd.PeriodIndex([p])

In [4]: pd.Series(pi).dt.end_time[0]
Out[4]: Timestamp(2017-01-01 00:00:00)

In [5]: p.end_time
Out[5]: Timestamp(2017-01-01 23:59:59.999999999)

新しい動作:

Series.dt.end_timeを呼び出すと、たとえばPeriod.end_timeの場合と同様に、時刻が「23:59:59.999999999」となるようになりました。

In [61]: p = pd.Period('2017-01-01', 'D')

In [62]: pi = pd.PeriodIndex([p])

In [63]: pd.Series(pi).dt.end_time[0]
Out[63]: Timestamp('2017-01-01 23:59:59.999999999')

In [64]: p.end_time
Out[64]: Timestamp('2017-01-01 23:59:59.999999999')

タイムゾーン対応データに対する Series.unique#

タイムゾーン付き datetime 値に対するSeries.unique()の戻り値の型が、Timestampオブジェクトのnumpy.ndarrayからarrays.DatetimeArrayに変更されました (GH 24024)。

In [65]: ser = pd.Series([pd.Timestamp('2000', tz='UTC'),
   ....:                  pd.Timestamp('2000', tz='UTC')])
   ....: 

以前の動作:

In [3]: ser.unique()
Out[3]: array([Timestamp('2000-01-01 00:00:00+0000', tz='UTC')], dtype=object)

新しい動作:

In [66]: ser.unique()
Out[66]: 
<DatetimeArray>
['2000-01-01 00:00:00+00:00']
Length: 1, dtype: datetime64[ns, UTC]

疎なデータ構造のリファクタリング#

SparseArrayは、SparseSeriesおよびSparseDataFrameの列をバックアップする配列であり、現在拡張配列です (GH 21978GH 19056GH 22835)。このインターフェースに準拠し、pandas の他の部分との一貫性を保つために、いくつかの API の破壊的変更が行われました。

  • SparseArraynumpy.ndarrayのサブクラスではなくなりました。SparseArrayを NumPy 配列に変換するには、numpy.asarray()を使用してください。

  • SparseArray.dtypeおよびSparseSeries.dtypeは、np.dtypeではなくSparseDtypeのインスタンスになりました。基になる dtype にアクセスするにはSparseDtype.subtypeを使用してください。

  • numpy.asarray(sparse_array)は、非埋め込み値だけでなく、すべての値を含む密な配列を返すようになりました (GH 14167)

  • SparseArray.takeは、pandas.api.extensions.ExtensionArray.take()のAPIに適合するようになりました (GH 19506)

    • allow_fillのデフォルト値がFalseからTrueに変更されました。

    • outおよびmodeパラメータは、指定しても受け入れられなくなりました (以前は、指定するとエラーが発生していました)。

    • indicesにスカラーを渡すことは許可されなくなりました。

  • 疎なSeriesと密なSeriesが混在するconcat()の結果は、SparseSeriesではなく、疎な値を持つSeriesになります。

  • SparseDataFrame.combineDataFrame.combine_firstは、疎な列と密な列を疎なサブタイプを保持したまま結合することをサポートしなくなりました。結果はオブジェクトdtypeのSparseArrayになります。

  • SparseArray.fill_valueを異なるdtypeの fill_value に設定することが許可されるようになりました。

  • 疎な値を持つ単一列をスライスする場合、DataFrame[column]SparseSeriesではなく、疎な値を持つSeriesになりました (GH 23559)。

  • Series.where() の結果は、他の拡張配列と同様に、疎な値を持つ Series になりました (GH 24077)。

大きな密な配列を具体化する必要がある、または具体化する可能性が高い操作に対して、いくつかの新しい警告が発行されます。

  • 密な配列が構築されて塗りつぶされた配列が作成されるため、method を使用して fillna を使用すると errors.PerformanceWarning が発行されます。 value で塗りつぶすのは、疎な配列を塗りつぶす効率的な方法です。

  • 異なる塗りつぶし値を持つ疎な Series を連結すると、errors.PerformanceWarning が発行されるようになりました。最初の疎な配列の塗りつぶし値が引き続き使用されます。

これらの API 破壊的な変更に加えて、多くの パフォーマンス改善とバグ修正 が行われました。

最後に、Series.sparse.from_coo() のような疎な値固有のメソッドを提供するために、Series.sparse アクセサが追加されました。

In [67]: s = pd.Series([0, 0, 1, 1, 1], dtype='Sparse[int]')

In [68]: s.sparse.density
Out[68]: 0.6

get_dummies() は常に DataFrame を返します#

以前は、sparse=Trueget_dummies() に渡された場合、すべての列がダミーエンコードされたか、一部の列のみがダミーエンコードされたかによって、戻り値は DataFrame または SparseDataFrame のいずれかでした。現在では、常に DataFrame が返されます (GH 24284)。

以前の動作

最初の get_dummies() は、列 A がダミーエンコードされていないため、DataFrame を返します。["B", "C"] のみが get_dummies に渡されると、すべての列がダミーエンコードされ、SparseDataFrame が返されていました。

In [2]: df = pd.DataFrame({"A": [1, 2], "B": ['a', 'b'], "C": ['a', 'a']})

In [3]: type(pd.get_dummies(df, sparse=True))
Out[3]: pandas.core.frame.DataFrame

In [4]: type(pd.get_dummies(df[['B', 'C']], sparse=True))
Out[4]: pandas.core.sparse.frame.SparseDataFrame

新しい動作

現在、戻り値の型は一貫して DataFrame です。

In [69]: type(pd.get_dummies(df, sparse=True))
Out[69]: pandas.core.frame.DataFrame

In [70]: type(pd.get_dummies(df[['B', 'C']], sparse=True))
Out[70]: pandas.core.frame.DataFrame

SparseDataFrame と疎な値を持つ DataFrame の間にメモリ使用量の違いはありません。メモリ使用量は、以前のバージョンの pandas と同じです。

DataFrame.to_dict(orient='index') で ValueError を発生させます#

DataFrame.to_dict() のバグにより、orient='index' と非ユニークなインデックスで使用した場合、データが失われる代わりに ValueError が発生するようになりました (GH 22801)。

In [71]: df = pd.DataFrame({'a': [1, 2], 'b': [0.5, 0.75]}, index=['A', 'A'])

In [72]: df
Out[72]: 
   a     b
A  1  0.50
A  2  0.75

[2 rows x 2 columns]

In [73]: df.to_dict(orient='index')
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[73], line 1
----> 1 df.to_dict(orient='index')

File ~/work/pandas/pandas/pandas/util/_decorators.py:333, in deprecate_nonkeyword_arguments.<locals>.decorate.<locals>.wrapper(*args, **kwargs)
    327 if len(args) > num_allow_args:
    328     warnings.warn(
    329         msg.format(arguments=_format_argument_list(allow_args)),
    330         FutureWarning,
    331         stacklevel=find_stack_level(),
    332     )
--> 333 return func(*args, **kwargs)

File ~/work/pandas/pandas/pandas/core/frame.py:2183, in DataFrame.to_dict(self, orient, into, index)
   2080 """
   2081 Convert the DataFrame to a dictionary.
   2082 
   (...)
   2179  defaultdict(<class 'list'>, {'col1': 2, 'col2': 0.75})]
   2180 """
   2181 from pandas.core.methods.to_dict import to_dict
-> 2183 return to_dict(self, orient, into=into, index=index)

File ~/work/pandas/pandas/pandas/core/methods/to_dict.py:242, in to_dict(df, orient, into, index)
    240 elif orient == "index":
    241     if not df.index.is_unique:
--> 242         raise ValueError("DataFrame index must be unique for orient='index'.")
    243     columns = df.columns.tolist()
    244     if are_all_object_dtype_cols:

ValueError: DataFrame index must be unique for orient='index'.

ティック DateOffset の正規化制限#

normalize=True を使用して Tick オブジェクト (DayHourMinuteSecondMilliMicroNano) を作成することはサポートされなくなりました。これにより、追加が単調でなくなったり結合的でなくなったりする予期しない動作が防止されます (GH 21427)。

以前の動作:

In [2]: ts = pd.Timestamp('2018-06-11 18:01:14')

In [3]: ts
Out[3]: Timestamp('2018-06-11 18:01:14')

In [4]: tic = pd.offsets.Hour(n=2, normalize=True)
   ...:

In [5]: tic
Out[5]: <2 * Hours>

In [6]: ts + tic
Out[6]: Timestamp('2018-06-11 00:00:00')

In [7]: ts + tic + tic + tic == ts + (tic + tic + tic)
Out[7]: False

新しい動作:

In [74]: ts = pd.Timestamp('2018-06-11 18:01:14')

In [75]: tic = pd.offsets.Hour(n=2)

In [76]: ts + tic + tic + tic == ts + (tic + tic + tic)
Out[76]: True

期間の減算#

ある Period から別の Period を減算すると、整数ではなく DateOffset が返されるようになりました (GH 21314)。

以前の動作:

In [2]: june = pd.Period('June 2018')

In [3]: april = pd.Period('April 2018')

In [4]: june - april
Out [4]: 2

新しい動作:

In [77]: june = pd.Period('June 2018')

In [78]: april = pd.Period('April 2018')

In [79]: june - april
Out[79]: <2 * MonthEnds>

同様に、PeriodIndex から Period を減算すると、Int64Index ではなく DateOffset オブジェクトの Index が返されるようになりました。

以前の動作:

In [2]: pi = pd.period_range('June 2018', freq='M', periods=3)

In [3]: pi - pi[0]
Out[3]: Int64Index([0, 1, 2], dtype='int64')

新しい動作:

In [80]: pi = pd.period_range('June 2018', freq='M', periods=3)

In [81]: pi - pi[0]
Out[81]: Index([<0 * MonthEnds>, <MonthEnd>, <2 * MonthEnds>], dtype='object')

DataFrame からの NaN の加算/減算#

timedelta64[ns] dtype の DataFrame 列から NaN を加算または減算すると、すべて NaT を返す代わりに TypeError が発生するようになりました。これは TimedeltaIndex および Series の動作との互換性のためです (GH 22163)。

In [82]: df = pd.DataFrame([pd.Timedelta(days=1)])

In [83]: df
Out[83]: 
       0
0 1 days

[1 rows x 1 columns]

以前の動作:

In [4]: df = pd.DataFrame([pd.Timedelta(days=1)])

In [5]: df - np.nan
Out[5]:
    0
0 NaT

新しい動作:

In [2]: df - np.nan
...
TypeError: unsupported operand type(s) for -: 'TimedeltaIndex' and 'float'

DataFrame の比較演算のブロードキャスト変更#

以前は、DataFrame の比較演算 (==, !=, ...) のブロードキャスト動作は、算術演算 (+, -, ...) の動作と一貫性がありませんでした。これらのケースでは、比較演算の動作が算術演算と一致するように変更されました (GH 22880)。

影響を受けるケースは次のとおりです。

  • 1行または1列の2次元 np.ndarray に対して演算を行うと、np.ndarray と同じ方法でブロードキャストされるようになりました (GH 23000)。

  • DataFrame の行数と一致する長さのリストまたはタプルは、列ごとに演算する代わりに ValueError を発生させるようになりました (GH 22880

  • DataFrame の列数と一致する長さのリストまたはタプルは、ValueError を発生させる代わりに、行ごとに演算するようになりました (GH 22880)。

In [84]: arr = np.arange(6).reshape(3, 2)

In [85]: df = pd.DataFrame(arr)

In [86]: df
Out[86]: 
   0  1
0  0  1
1  2  3
2  4  5

[3 rows x 2 columns]

以前の動作:

In [5]: df == arr[[0], :]
    ...: # comparison previously broadcast where arithmetic would raise
Out[5]:
       0      1
0   True   True
1  False  False
2  False  False
In [6]: df + arr[[0], :]
...
ValueError: Unable to coerce to DataFrame, shape must be (3, 2): given (1, 2)

In [7]: df == (1, 2)
    ...: # length matches number of columns;
    ...: # comparison previously raised where arithmetic would broadcast
...
ValueError: Invalid broadcasting comparison [(1, 2)] with block values
In [8]: df + (1, 2)
Out[8]:
   0  1
0  1  3
1  3  5
2  5  7

In [9]: df == (1, 2, 3)
    ...:  # length matches number of rows
    ...:  # comparison previously broadcast where arithmetic would raise
Out[9]:
       0      1
0  False   True
1   True  False
2  False  False
In [10]: df + (1, 2, 3)
...
ValueError: Unable to coerce to Series, length must be 2: given 3

新しい動作:

# Comparison operations and arithmetic operations both broadcast.
In [87]: df == arr[[0], :]
Out[87]: 
       0      1
0   True   True
1  False  False
2  False  False

[3 rows x 2 columns]

In [88]: df + arr[[0], :]
Out[88]: 
   0  1
0  0  2
1  2  4
2  4  6

[3 rows x 2 columns]
# Comparison operations and arithmetic operations both broadcast.
In [89]: df == (1, 2)
Out[89]: 
       0      1
0  False  False
1  False  False
2  False  False

[3 rows x 2 columns]

In [90]: df + (1, 2)
Out[90]: 
   0  1
0  1  3
1  3  5
2  5  7

[3 rows x 2 columns]
# Comparison operations and arithmetic operations both raise ValueError.
In [6]: df == (1, 2, 3)
...
ValueError: Unable to coerce to Series, length must be 2: given 3

In [7]: df + (1, 2, 3)
...
ValueError: Unable to coerce to Series, length must be 2: given 3

DataFrame の算術演算のブロードキャスト変更#

2次元の np.ndarray オブジェクトを使用して演算する場合の DataFrame の算術演算は、np.ndarray のブロードキャストと同じ方法でブロードキャストされるようになりました (GH 23000)。

In [91]: arr = np.arange(6).reshape(3, 2)

In [92]: df = pd.DataFrame(arr)

In [93]: df
Out[93]: 
   0  1
0  0  1
1  2  3
2  4  5

[3 rows x 2 columns]

以前の動作:

In [5]: df + arr[[0], :]   # 1 row, 2 columns
...
ValueError: Unable to coerce to DataFrame, shape must be (3, 2): given (1, 2)
In [6]: df + arr[:, [1]]   # 1 column, 3 rows
...
ValueError: Unable to coerce to DataFrame, shape must be (3, 2): given (3, 1)

新しい動作:

In [94]: df + arr[[0], :]   # 1 row, 2 columns
Out[94]: 
   0  1
0  0  2
1  2  4
2  4  6

[3 rows x 2 columns]

In [95]: df + arr[:, [1]]   # 1 column, 3 rows
Out[95]: 
   0   1
0  1   2
1  5   6
2  9  10

[3 rows x 2 columns]

Series と Index のデータ型不整合#

Series および Index コンストラクターは、データが渡された dtype= と互換性がない場合にエラーを発生させるようになりました (GH 15832)。

以前の動作:

In [4]: pd.Series([-1], dtype="uint64")
Out [4]:
0    18446744073709551615
dtype: uint64

新しい動作:

In [4]: pd.Series([-1], dtype="uint64")
Out [4]:
...
OverflowError: Trying to coerce negative values to unsigned integers

連結の変更#

NA 値を持つ int 型の Categorical に対して pandas.concat() を呼び出すと、別の int 型の Categorical 以外と連結する場合、それらがオブジェクトとして処理されるようになりました (GH 19214)。

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

In [97]: c = pd.Series([0, 1, np.nan], dtype="category")

以前の動作

In [3]: pd.concat([s, c])
Out[3]:
0    0.0
1    1.0
2    NaN
0    0.0
1    1.0
2    NaN
dtype: float64

新しい動作

In [98]: pd.concat([s, c])
Out[98]: 
0    0.0
1    1.0
2    NaN
0    0.0
1    1.0
2    NaN
Length: 6, dtype: float64

日時型 API の変更#

  • None ではない freq 属性を持つ DatetimeIndexTimedeltaIndex の場合、整数型の配列または Index の加算または減算は同じクラスのオブジェクトを返します (GH 19959)。

  • DateOffset オブジェクトは不変になりました。これらのいずれかを変更しようとすると、AttributeError が発生するようになりました (GH 21341)。

  • PeriodIndex から別の PeriodIndex を減算すると、TypeError を発生させる代わりに、DateOffset オブジェクトの object-dtype Index が返されるようになりました (GH 20049)。

  • cut()qcut() は、入力がそれぞれ datetime または timedelta dtype で retbins=True の場合、DatetimeIndex または TimedeltaIndex のビンを返すようになりました (GH 19891)。

  • DatetimeIndex.to_period()Timestamp.to_period() は、タイムゾーン情報が失われる場合に警告を発行するようになりました (GH 21333)。

  • PeriodIndex.tz_convert() および PeriodIndex.tz_localize() は削除されました (GH 21781)。

その他の API の変更#

  • dtype に整数を指定して新しく構築された空の DataFrame は、index が指定されている場合にのみ float64 にキャストされるようになりました (GH 22858)。

  • othersset の場合、Series.str.cat() はエラーを発生させるようになりました (GH 23009)。

  • DatetimeIndex または TimedeltaIndex にスカラー値を渡すと、ValueError の代わりに TypeError が発生するようになりました (GH 23539)。

  • HTMLFormattermax_rows および max_cols パラメーターは、切り捨てが DataFrameFormatter によって処理されるため削除されました (GH 23818)。

  • read_csv() は、欠損値のある列が dtype bool であると宣言された場合、ValueError を発生させるようになりました (GH 20591)。

  • MultiIndex.to_frame() から得られる DataFrame の列順序は、MultiIndex.names の順序と一致することが保証されるようになりました (GH 22420)。

  • タプルのシーケンスではなく、誤って DatetimeIndexMultiIndex.from_tuples() に渡した場合、ValueError ではなく TypeError が発生するようになりました (GH 24024)。

  • pd.offsets.generate_range() の引数 time_rule は削除されました。代わりに offset を使用してください (GH 24157)。

  • 0.23.x では、pandas は数値列 (例: int dtype の列) と object dtype の列のマージで ValueError を発生させていました (GH 9780)。object と他の dtype をマージする機能が再度有効になりました。ただし、pandas は、数値列と文字列のみで構成される object dtype の列のマージでは引き続きエラーを発生させます (GH 21681)。

  • 重複する名前を持つ MultiIndex のレベルにアクセスする (get_level_values() などで) と、KeyError ではなく ValueError が発生するようになりました (GH 21678)。

  • サブ dtype が無効な場合、IntervalDtype の不正な構築は、ValueError ではなく常に TypeError を発生させるようになりました (GH 21185)。

  • ユニークでない MultiIndex を持つ DataFrame を再インデックスしようとすると、以前は Exception が発生していましたが、現在は ValueError が発生するようになりました (GH 21770)。

  • Index の減算は、TypeError を発生させる代わりに、要素ごとに演算しようとします (GH 19369)。

  • pandas.io.formats.style.Styler は、to_excel() を使用する際に number-format プロパティをサポートするようになりました (GH 22015)。

  • DataFrame.corr()Series.corr() は、無効なメソッドが指定された場合に、KeyError の代わりに役立つエラーメッセージとともに ValueError を発生させるようになりました (GH 22298)。

  • shift() は、0でシフトした場合にselfを返すという以前の動作ではなく、常にコピーを返すようになりました (GH 22397)。

  • DataFrame.set_index() は、より良い (そしてより頻度の低い) KeyError を発生させ、不正な型に対して ValueError を発生させ、drop=True で重複する列名があっても失敗しないようになりました (GH 22484)。

  • 同じ型の複数の ExtensionArray を持つ DataFrame の単一行をスライスすると、オブジェクトへの強制変換ではなく、dtype が保持されるようになりました (GH 22784)。

  • DateOffset 属性 _cacheable およびメソッド _should_cache は削除されました (GH 23118)。

  • Series.searchsorted() は、検索するスカラー値が指定された場合、配列ではなくスカラーを返すようになりました (GH 23801)。

  • Categorical.searchsorted() は、検索するスカラー値が指定された場合、配列ではなくスカラーを返すようになりました (GH 23466)。

  • Categorical.searchsorted() は、検索するキーがカテゴリに見つからない場合、ValueError ではなく KeyError を発生させるようになりました (GH 23466)。

  • Index.hasnans() および Series.hasnans() は常に Python のブール値を返すようになりました。以前は、状況によっては Python または NumPy のブール値が返される可能性がありました (GH 23294)。

  • DataFrame.to_html()DataFrame.to_string() の引数の順序が、互いに一貫するように変更されました (GH 23614)。

  • CategoricalIndex.reindex() は、ターゲットインデックスが非ユニークで、現在のインデックスと等しくない場合、ValueError を発生させるようになりました。以前は、ターゲットインデックスがカテゴリカル dtype でない場合にのみ発生していました (GH 23963)。

  • Series.to_list() および Index.to_list() は、それぞれ Series.tolist および Index.tolist のエイリアスになりました (GH 8826)。

  • SparseSeries.unstack の結果は、SparseDataFrame ではなく、疎な値を持つ DataFrame になりました (GH 24372)。

  • DatetimeIndexTimedeltaIndex は、dtype の精度を無視しなくなりました。ナノ秒以外の解像度の dtype を渡すと ValueError が発生します (GH 24753)。

拡張型変更#

等価性とハッシュ可能性

pandas では、拡張 dtype がハッシュ可能である必要があります (つまり、それぞれの ExtensionDtype オブジェクトです。ハッシュ可能性は、対応する ExtensionArray の値には要求されません)。基底クラスはデフォルトの __eq____hash__ を実装します。パラメーター化された dtype を使用している場合、ExtensionDtype._metadata タプルを __init__ メソッドのシグネチャと一致するように更新する必要があります。詳細については、pandas.api.extensions.ExtensionDtype を参照してください (GH 22476)。

新規および変更されたメソッド

  • dropna() が追加されました (GH 21185)。

  • repeat() が追加されました (GH 24349)。

  • ExtensionArray コンストラクター _from_sequence は、キーワード引数 copy=False を受け取るようになりました (GH 21185)。

  • pandas.api.extensions.ExtensionArray.shift() が基本の ExtensionArray インターフェースの一部として追加されました (GH 22387)。

  • searchsorted() が追加されました (GH 24350)。

  • オプトイン基底クラスメソッドのオーバーライドを介した summean などの削減操作のサポート (GH 22762)。

  • ExtensionArray.isna()ExtensionArray を返すことが許可されました (GH 22325)。

Dtypeの変更

  • ExtensionDtype は、文字列 dtype からインスタンス化する機能を得ました。たとえば、decimal は登録された DecimalDtype をインスタンス化します。さらに、ExtensionDtype はメソッド construct_array_type を獲得しました (GH 21185)。

  • 拡張 dtype が数値とみなされるかどうかを制御するために ExtensionDtype._is_numeric が追加されました (GH 22290)。

  • pandas に拡張型を登録するために pandas.api.types.register_extension_dtype() が追加されました (GH 22664)。

  • PeriodDtypeDatetimeTZDtype、および IntervalDtype.type 属性が、dtype のインスタンス (それぞれ PeriodTimestamp、および Interval) に更新されました (GH 22938)。

演算子サポート

ExtensionArray に基づく Series は、算術演算子と比較演算子をサポートするようになりました (GH 19577)。ExtensionArray の演算子サポートを提供する方法は 2 つあります。

  1. ExtensionArray サブクラスに各演算子を定義します。

  2. ExtensionArray の基になる要素 (スカラー) にすでに定義されている演算子に依存する pandas の演算子実装を使用します。

演算子サポートを追加する両方の方法の詳細については、ExtensionArray Operator Support ドキュメントセクションを参照してください。

その他の変更

  • pandas.api.extensions.ExtensionArray のデフォルトの repr が提供されるようになりました (GH 23601)。

  • ExtensionArray._formatting_values() は非推奨になりました。代わりに ExtensionArray._formatter を使用してください (GH 23601)。

  • ブール型 dtype の ExtensionArray は、ブール型インデクサーとして正しく機能するようになりました。pandas.api.types.is_bool_dtype() は、それらを適切にブール値として考慮するようになりました (GH 22326)。

バグ修正

  • ExtensionArray と整数インデックスを使用する SeriesSeries.get() のバグ (GH 21257)。

  • shift()ExtensionArray.shift() にディスパッチされるようになりました (GH 22386)。

  • Series.combine() は、Series 内の ExtensionArray と正しく連携するようになりました (GH 20825)。

  • スカラー引数を持つ Series.combine() は、任意の関数型で動作するようになりました (GH 21248)。

  • Series.astype() および DataFrame.astype() は、ExtensionArray.astype() にディスパッチされるようになりました (GH 21185)。

  • 同じ型の複数の ExtensionArray を持つ DataFrame の単一行をスライスすると、オブジェクトへの強制変換ではなく、dtype が保持されるようになりました (GH 22784)。

  • 異なる拡張 dtype を持つ複数の Series を連結する際に、オブジェクト dtype にキャストされないバグ (GH 22994)。

  • ExtensionArray に裏打ちされた Series は util.hash_pandas_object() で動作するようになりました (GH 23066)。

  • DataFrame.stack() は、各列が同じ拡張 dtype を持つ DataFrame の場合、オブジェクト dtype に変換しなくなりました。出力 Series は、列と同じ dtype を持ちます (GH 23077)。

  • Series.unstack() および DataFrame.unstack() は、拡張配列をオブジェクト型 ndarray に変換しなくなりました。出力 DataFrame の各列は、入力と同じ dtype を持つようになりました (GH 23077)。

  • Dataframe.groupby() でグループ化し、ExtensionArray で集計した場合、実際の ExtensionArray の dtype が返されないバグがありました (GH 23227)。

  • 拡張配列をバックエンドとする列でマージする際の pandas.merge() のバグ (GH 23020)。

非推奨#

  • MultiIndex.labels は非推奨となり、MultiIndex.codes に置き換えられました。機能は変更されていません。新しい名前は、これらのコードの性質をよりよく反映し、MultiIndex API を CategoricalIndex の API に近づけます (GH 13443)。その結果、MultiIndex での labels の他の使用も非推奨となり、codes に置き換えられました。

    • MultiIndex インスタンスは、labels ではなく codes という名前のパラメータを使用して初期化する必要があります。

    • MultiIndex.set_labelsMultiIndex.set_codes() に賛成して非推奨になりました。

    • メソッド MultiIndex.copy() では、labels パラメータが非推奨となり、codes パラメータに置き換えられました。

  • DataFrame.to_stata()read_stata()StataReader および StataWriter では、encoding 引数が非推奨になりました。Stata dta ファイルのエンコーディングはファイルタイプによって決定され、変更できません (GH 21244)。

  • MultiIndex.to_hierarchical() は非推奨となり、将来のバージョンで削除されます (GH 21613)。

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

  • Series.compress() は非推奨になりました。代わりに Series[condition] を使用してください (GH 18262)。

  • Series.to_csv() のシグネチャは DataFrame.to_csv() のシグネチャと統一されました。最初の引数の名前は path_or_buf となり、以降の引数の順序が変更され、header 引数のデフォルトは True になりました (GH 19715)。

  • Categorical.from_codes() は、codes 引数に浮動小数点値を提供することを非推奨としました (GH 21767)。

  • pandas.read_table() は非推奨になりました。代わりに、必要に応じて sep='\t' を渡して read_csv() を使用してください。この非推奨化は 0.25.0 で削除されました (GH 21948)。

  • Series.str.cat() は、リストライク**内**の任意のリストライクの使用を非推奨としました。リストライクコンテナは、多くの SeriesIndex、または1次元の np.ndarray を含めることができます。あるいは、スカラー値のみを含めることができます (GH 21950)。

  • FrozenNDArray.searchsorted() は、v パラメーターを非推奨とし、代わりに value を使用するようになりました (GH 14645)。

  • DatetimeIndex.shift() および PeriodIndex.shift() は、Index.shift() および Series.shift() との一貫性のために、n の代わりに periods 引数を受け入れるようになりました。n を使用すると非推奨の警告が発生します (GH 22458, GH 22912)。

  • 異なる Index コンストラクタの fastpath キーワードは非推奨になりました (GH 23110)。

  • Timestamp.tz_localize(), DatetimeIndex.tz_localize(), and Series.tz_localize() は、errors 引数を非推奨とし、代わりに nonexistent 引数を使用するようになりました (GH 8917)。

  • クラス FrozenNDArray は非推奨になりました。このクラスが削除されると、アンピクル時に FrozenNDArraynp.ndarray にアンピクルされます (GH 9031)。

  • メソッド DataFrame.update() および Panel.update() は、raise_conflict=False|True キーワードを非推奨とし、代わりに errors='ignore'|'raise' を使用するようになりました (GH 23585)。

  • メソッド Series.str.partition() および Series.str.rpartition() は、pat キーワードを非推奨とし、代わりに sep を使用するようになりました (GH 22676)。

  • pandas.read_feather()nthreads キーワードは、pyarrow>=0.11.0 の変更を反映して use_threads に置き換えられました (GH 23053)。

  • pandas.read_excel() は、usecols を整数として受け入れることを非推奨としました。代わりに、0 から usecols までの整数を含むリストを渡してください (GH 23527)。

  • datetime64-dtyped データを持つデータから TimedeltaIndex を構築することは非推奨になりました。将来のバージョンでは TypeError が発生します (GH 23539)。

  • timedelta64-dtyped データを持つデータから DatetimeIndex を構築することは非推奨になりました。将来のバージョンでは TypeError が発生します (GH 23675)。

  • DatetimeIndex.to_series()keep_tz キーワードの keep_tz=False オプション (デフォルト) は非推奨になりました (GH 17832)。

  • タイムゾーン対応の datetime.datetime または TimestampTimestamptz 引数でタイムゾーン変換することは非推奨になりました。代わりに Timestamp.tz_convert() を使用してください (GH 23579)。

  • pandas.api.types.is_period() は非推奨となり、代わりに pandas.api.types.is_period_dtype を使用するようになりました (GH 23917)。

  • pandas.api.types.is_datetimetz() は非推奨となり、代わりに pandas.api.types.is_datetime64tz を使用するようになりました (GH 23917)。

  • startendperiods の範囲引数を渡して TimedeltaIndexDatetimeIndex、または PeriodIndex を作成することは非推奨となり、代わりに timedelta_range()date_range()、または period_range() を使用するようになりました (GH 23919)。

  • 'datetime64[ns, UTC]' のような文字列エイリアスを DatetimeTZDtypeunit パラメータとして渡すことは非推奨になりました。代わりに DatetimeTZDtype.construct_from_string を使用してください (GH 23990)。

  • infer_dtype()skipna パラメータは、将来のバージョンの pandas でデフォルトで True に切り替わります (GH 17066, GH 24050)。

  • Series.where() をカテゴリデータで使用する場合、カテゴリに含まれない other を提供することは非推奨になりました。最初にカテゴリデータを別の dtype に変換するか、other をカテゴリに追加してください (GH 24077)。

  • Series.clip_lower()Series.clip_upper()DataFrame.clip_lower() および DataFrame.clip_upper() は非推奨であり、将来のバージョンで削除されます。Series.clip(lower=threshold)Series.clip(upper=threshold) および同等の DataFrame メソッドを使用してください (GH 24203)。

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

  • timedelta64[ns] dtype を持つ Series.fillna() および DataFrame.fillna() に整数を渡すことは非推奨であり、将来のバージョンでは TypeError が発生します。代わりに obj.fillna(pd.Timedelta(...)) を使用してください (GH 24694)。

  • Series.cat.categoricalSeries.cat.nameSeries.cat.index は非推奨になりました。代わりに Series.cat または Series の属性を直接使用してください (GH 24751)。

  • np.dtype('datetime64') または timedelta64 のように精度を持たない dtype を IndexDatetimeIndex および TimedeltaIndex に渡すことは非推奨になりました。代わりにナノ秒精度の dtype を使用してください (GH 24753)。

日時と時間差との整数加算/減算は非推奨になりました#

以前は、ユーザーは場合によっては、整数または整数 dtype の配列を TimestampDatetimeIndex、および TimedeltaIndex に加算または減算することができました。

この用法は非推奨になりました。代わりに、オブジェクトの freq 属性の整数倍を加算または減算してください (GH 21939, GH 23878)。

以前の動作:

In [5]: ts = pd.Timestamp('1994-05-06 12:15:16', freq=pd.offsets.Hour())
In [6]: ts + 2
Out[6]: Timestamp('1994-05-06 14:15:16', freq='H')

In [7]: tdi = pd.timedelta_range('1D', periods=2)
In [8]: tdi - np.array([2, 1])
Out[8]: TimedeltaIndex(['-1 days', '1 days'], dtype='timedelta64[ns]', freq=None)

In [9]: dti = pd.date_range('2001-01-01', periods=2, freq='7D')
In [10]: dti + pd.Index([1, 2])
Out[10]: DatetimeIndex(['2001-01-08', '2001-01-22'], dtype='datetime64[ns]', freq=None)

新しい動作:

In [108]: ts = pd.Timestamp('1994-05-06 12:15:16', freq=pd.offsets.Hour())

In[109]: ts + 2 * ts.freq
Out[109]: Timestamp('1994-05-06 14:15:16', freq='H')

In [110]: tdi = pd.timedelta_range('1D', periods=2)

In [111]: tdi - np.array([2 * tdi.freq, 1 * tdi.freq])
Out[111]: TimedeltaIndex(['-1 days', '1 days'], dtype='timedelta64[ns]', freq=None)

In [112]: dti = pd.date_range('2001-01-01', periods=2, freq='7D')

In [113]: dti + pd.Index([1 * dti.freq, 2 * dti.freq])
Out[113]: DatetimeIndex(['2001-01-08', '2001-01-22'], dtype='datetime64[ns]', freq=None)

DatetimeIndex に整数データとタイムゾーンを渡す#

将来のバージョンのpandasでは、整数データとタイムゾーンが渡された場合の DatetimeIndex の動作が変更されます。以前は、これらは目的のタイムゾーンの壁時間として解釈されていました。将来的には、これらはUTCの壁時間として解釈され、その後、目的のタイムゾーンに変換されます (GH 24559)。

デフォルトの動作は同じですが、警告が表示されます。

In [3]: pd.DatetimeIndex([946684800000000000], tz="US/Central")
/bin/ipython:1: FutureWarning:
    Passing integer-dtype data and a timezone to DatetimeIndex. Integer values
    will be interpreted differently in a future version of pandas. Previously,
    these were viewed as datetime64[ns] values representing the wall time
    *in the specified timezone*. In the future, these will be viewed as
    datetime64[ns] values representing the wall time *in UTC*. This is similar
    to a nanosecond-precision UNIX epoch. To accept the future behavior, use

        pd.to_datetime(integer_data, utc=True).tz_convert(tz)

    To keep the previous behavior, use

        pd.to_datetime(integer_data).tz_localize(tz)

 #!/bin/python3
 Out[3]: DatetimeIndex(['2000-01-01 00:00:00-06:00'], dtype='datetime64[ns, US/Central]', freq=None)

警告メッセージが説明しているように、整数値がUTCであることを指定し、その後、最終的なタイムゾーンに変換することで、将来の動作をオプトインします。

In [99]: pd.to_datetime([946684800000000000], utc=True).tz_convert('US/Central')
Out[99]: DatetimeIndex(['1999-12-31 18:00:00-06:00'], dtype='datetime64[ns, US/Central]', freq=None)

古い動作は、最終的なタイムゾーンに直接ローカライズすることで維持できます。

In [100]: pd.to_datetime([946684800000000000]).tz_localize('US/Central')
Out[100]: DatetimeIndex(['2000-01-01 00:00:00-06:00'], dtype='datetime64[ns, US/Central]', freq=None)

タイムゾーン対応のSeriesとIndexをNumPy配列に変換する#

タイムゾーン対応のdatetimeデータを持つ Series または Index からの変換は、デフォルトでタイムゾーンを保持するように変更されます (GH 23569)。

NumPyには、タイムゾーン対応のdatetime専用のdtypeがありません。以前は、タイムゾーン対応のdatetimeを持つ Series または DatetimeIndex をNumPy配列に変換すると、以下の方法で変換されました。

  1. tz-awareデータをUTCに変換する

  2. タイムゾーン情報を削除する

  3. datetime64[ns] dtypeを持つ numpy.ndarray を返す

将来のバージョンのpandasでは、各値が正しいタイムゾーンを持つ Timestamp であるオブジェクトdtypeのNumPy配列を返すことで、タイムゾーン情報が保持されます。

In [101]: ser = pd.Series(pd.date_range('2000', periods=2, tz="CET"))

In [102]: ser
Out[102]: 
0   2000-01-01 00:00:00+01:00
1   2000-01-02 00:00:00+01:00
Length: 2, dtype: datetime64[ns, CET]

デフォルトの動作は同じですが、警告が表示されます。

In [8]: np.asarray(ser)
/bin/ipython:1: FutureWarning: Converting timezone-aware DatetimeArray to timezone-naive
      ndarray with 'datetime64[ns]' dtype. In the future, this will return an ndarray
      with 'object' dtype where each element is a 'pandas.Timestamp' with the correct 'tz'.

        To accept the future behavior, pass 'dtype=object'.
        To keep the old behavior, pass 'dtype="datetime64[ns]"'.
  #!/bin/python3
Out[8]:
array(['1999-12-31T23:00:00.000000000', '2000-01-01T23:00:00.000000000'],
      dtype='datetime64[ns]')

以前または将来の動作は、dtype を指定することで、警告なしに取得できます。

以前の動作

In [103]: np.asarray(ser, dtype='datetime64[ns]')
Out[103]: 
array(['1999-12-31T23:00:00.000000000', '2000-01-01T23:00:00.000000000'],
      dtype='datetime64[ns]')

将来の動作

# New behavior
In [104]: np.asarray(ser, dtype=object)
Out[104]: 
array([Timestamp('2000-01-01 00:00:00+0100', tz='CET'),
       Timestamp('2000-01-02 00:00:00+0100', tz='CET')], dtype=object)

または Series.to_numpy() を使用して

In [105]: ser.to_numpy()
Out[105]: 
array([Timestamp('2000-01-01 00:00:00+0100', tz='CET'),
       Timestamp('2000-01-02 00:00:00+0100', tz='CET')], dtype=object)

In [106]: ser.to_numpy(dtype="datetime64[ns]")
Out[106]: 
array(['1999-12-31T23:00:00.000000000', '2000-01-01T23:00:00.000000000'],
      dtype='datetime64[ns]')

上記のすべては、tz-aware値を持つ DatetimeIndex にも適用されます。

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

  • LongPanel クラスと WidePanel クラスは削除されました (GH 10892)

  • Series.repeat()reps 引数の名前を repeats に変更しました (GH 14645)

  • いくつかのプライベート関数が (非公開の) モジュール pandas.core.common から削除されました (GH 22001)

  • 以前非推奨だったモジュール pandas.core.datetools の削除 (GH 14105, GH 14094)

  • DataFrame.groupby() に渡される文字列で、列とインデックスレベルの両方を参照するものは ValueError を発生させるようになります (GH 14432)

  • Index.repeat()MultiIndex.repeat()n 引数の名前を repeats に変更しました (GH 14645)

  • Series コンストラクタと .astype メソッドは、dtype パラメータに単位 (例: np.datetime64) を指定せずにタイムスタンプdtypeが渡された場合、ValueError を発生させるようになります (GH 15987)

  • 以前非推奨だった as_indexer キーワードが str.match() から完全に削除されました (GH 22356, GH 6581)

  • モジュール pandas.types, pandas.computation, および pandas.util.decorators は削除されました (GH 16157, GH 16250)

  • pandas.io.formats.style.Styler のための pandas.formats.style シムが削除されました (GH 16059)

  • pandas.pnow, pandas.match, pandas.groupby, pd.get_store, pd.Expr, および pd.Term は削除されました (GH 15538, GH 15940)

  • Categorical.searchsorted()Series.searchsorted()v 引数の名前を value に変更しました (GH 14645)

  • pandas.parser, pandas.lib, および pandas.tslib は削除されました (GH 15537)

  • Index.searchsorted()key 引数の名前を value に変更しました (GH 14645)

  • DataFrame.consolidateSeries.consolidate は削除されました (GH 15501)

  • 以前非推奨だったモジュール pandas.json の削除 (GH 19944)

  • モジュール pandas.tools は削除されました (GH 15358, GH 16005)

  • SparseArray.get_values()SparseArray.to_dense()fill パラメータを削除しました (GH 14686)

  • DataFrame.sortlevelSeries.sortlevel は削除されました (GH 15099)

  • SparseSeries.to_dense()sparse_only パラメータを削除しました (GH 14686)

  • DataFrame.astype()Series.astype()raise_on_error 引数の名前を errors に変更しました (GH 14967)

  • is_sequence, is_any_int_dtype, および is_floating_dtypepandas.api.types から削除されました (GH 16163, GH 16189)

パフォーマンス改善#

  • 単調増加する CategoricalIndex を使用したSeriesおよびDataFrameのスライシングが非常に高速になり、Int64Index を使用したスライシングに匹敵する速度になりました。速度向上は、ラベルによるインデックス (つまり .loc) と位置によるインデックス (つまり .iloc) の両方で見られます (GH 20395)。単調増加する CategoricalIndex 自体のスライシング (つまり ci[1000:2000]) も同様の速度向上を示しています (GH 21659)

  • 別の CategoricalIndex と比較する場合の CategoricalIndex.equals() のパフォーマンスが向上しました (GH 24023)

  • 数値dtypeの場合の Series.describe() のパフォーマンスが向上しました (GH 21274)

  • 同順位を扱う場合の GroupBy.rank() のパフォーマンスが向上しました (GH 21237)

  • Period オブジェクトで構成される列を持つ DataFrame.set_index() のパフォーマンスが向上しました (GH 21582, GH 21606)

  • 拡張配列値 (例: Categorical) の Series.at()Index.get_value() のパフォーマンスが向上しました (GH 24204)

  • CategoricalCategoricalIndex のメンバーシップチェックのパフォーマンスが向上しました (つまり、x in cat 形式のチェックが大幅に高速化されました)。CategoricalIndex.contains() も同様に大幅に高速化されました (GH 21369, GH 21508)

  • HDFStore.groups() (および HDFStore.keys() などの依存関数) のパフォーマンスが向上しました (つまり、x in store チェックが大幅に高速化されました) (GH 21372)

  • sparse=True を指定した場合の pandas.get_dummies() のパフォーマンスが向上しました (GH 21997)

  • ソートされた非ユニークインデックスに対する IndexEngine.get_indexer_non_unique() のパフォーマンスが向上しました (GH 9466)

  • PeriodIndex.unique() のパフォーマンスが向上しました (GH 23083)

  • Series オブジェクトに対する concat() のパフォーマンスが向上しました (GH 23404)

  • タイムゾーンが不明またはUTCのdatetimeに対する DatetimeIndex.normalize()Timestamp.normalize() のパフォーマンスが向上しました (GH 23634)

  • dateutil UTCタイムゾーンを持つ DatetimeIndex.tz_localize() および様々な DatetimeIndex 属性のパフォーマンスが向上しました (GH 23772)

  • Python 3.7のWindowsにおける read_csv() のパフォーマンス低下が修正されました (GH 23516)

  • Series オブジェクトに対する Categorical コンストラクタのパフォーマンスが向上しました (GH 23814)

  • カテゴリカルデータに対する where() のパフォーマンスが向上しました (GH 24077)

  • Series の反復処理のパフォーマンスが向上しました。DataFrame.itertuples() を使用すると、内部的にすべての要素のリストを割り当てることなくイテレータが作成されるようになりました (GH 20783)

  • Period コンストラクタのパフォーマンスが向上し、PeriodArray および PeriodIndex の作成も恩恵を受けました (GH 24084, GH 24118)

  • tz-aware DatetimeArray の二項演算のパフォーマンスが向上しました (GH 24491)

バグ修正#

カテゴリカル#

  • Categorical.from_codes() のバグで、codes 内の NaN 値がサイレントに 0 に変換されていました (GH 21767)。将来的には、これは ValueError を発生させます。.from_codes([1.1, 2.0]) の動作も変更されます。

  • Categorical.sort_values() のバグで、na_position の値に関わらず、NaN 値が常に先頭に配置されていました (GH 22556)。

  • ブール値の Categorical を使用したインデックス作成時のバグ。現在、ブール値の Categorical はブールマスクとして扱われます (GH 22665)

  • dtype強制の変更後、空の値とブールカテゴリを持つ CategoricalIndex を構築すると ValueError が発生していました (GH 22702)。

  • ユーザーが指定した fill_valuefill_value をエンコードしておらず、その結果 ValueError、誤った結果、またはセグメンテーション違反が発生する可能性があった Categorical.take() のバグ (GH 23296)。

  • Series.unstack() で、カテゴリに存在しない fill_value を指定した場合、fill_value を無視する代わりに TypeError が発生するようになりました (GH 23284)

  • DataFrame.resample() でリサンプリングし、カテゴリカルデータで集計すると、カテゴリカルdtypeが失われるバグがありました (GH 23227)。

  • .str アクセサの多くのメソッドのバグで、CategoricalIndex.str コンストラクタを呼び出すと常に失敗していました (GH 23555, GH 23556)

  • カテゴリカルデータに対する Series.where() のバグで、カテゴリカルdtypeが失われていました (GH 24077)

  • Categorical.apply() のバグで、NaN 値が予測不能に処理されることがありました。これらは変更されないままになりました (GH 24241)

  • Categorical の比較メソッドのバグで、DataFrame に対して操作を行った場合に誤って ValueError が発生していました (GH 24630)

  • Categorical.set_categories() のバグで、rename=True で新しいカテゴリを少なく設定するとセグメンテーション違反が発生していました (GH 24675)

日付時刻ライク#

  • normalize 属性が異なる2つの DateOffset オブジェクトが等しいと評価されるバグを修正しました (GH 21404)

  • Timestamp.resolution() が1ナノ秒の Timedelta ではなく、1マイクロ秒の timedelta を誤って返していたバグを修正しました (GH 21336, GH 21365)

  • to_datetime() のバグで、box=True が指定された場合に常に Index を返していませんでした (GH 21864)

  • DatetimeIndex の比較のバグで、文字列比較が誤って TypeError を発生させていました (GH 22074)

  • DatetimeIndex の比較のバグで、timedelta64[ns] dtyped配列と比較した場合、一部のケースで TypeError が誤って発生したり、発生しなかったりしていました (GH 22074)

  • DatetimeIndex の比較のバグで、オブジェクトdtyped配列と比較した場合に発生していました (GH 22074)

  • datetime64[ns] dtypeの DataFrameTimedelta ライクなオブジェクトとの加算および減算のバグ (GH 22005, GH 22163)

  • datetime64[ns] dtypeの DataFrameDateOffset オブジェクトとの加算および減算のバグで、datetime64[ns] dtypeではなく object dtypeを返していました (GH 21610, GH 22163)

  • datetime64[ns] dtypeの DataFrameNaT と誤って比較されるバグ (GH 22242, GH 22163)

  • datetime64[ns] dtypeの DataFrameTimestamp ライクなオブジェクトを減算する際に、timedelta64[ns] dtypeではなく datetime64[ns] dtypeを誤って返していたバグ (GH 8554, GH 22163)

  • datetime64[ns] dtypeの DataFrame がナノ秒以外の単位を持つ np.datetime64 オブジェクトを減算する際に、ナノ秒に変換できなかったバグ (GH 18874, GH 22163)

  • DataFrame の比較のバグで、タイプが一致しない不等式チェックで TypeError が発生しなかったバグ (GH 8932, GH 22163)

  • datetime64[ns] dtypeを含む混合dtypeの DataFrame が等値比較で誤って TypeError を発生させていたバグ (GH 13128, GH 22163)

  • tz-aware datetime値を持つ単一列の DataFrame に対して DataFrame.valuesDatetimeIndex を返していたバグ。現在では、Timestamp オブジェクトの2D numpy.ndarray が返されます (GH 24024)

  • DataFrame.eq()NaT との比較で誤って True または NaN を返していたバグ (GH 15697, GH 22163)

  • DatetimeIndex の減算のバグで、誤って OverflowError が発生しなかったバグ (GH 22492, GH 22508)

  • DatetimeIndex のバグで、Timedelta オブジェクトによるインデックス作成を誤って許可していたバグ (GH 20464)

  • DatetimeIndex のバグで、元の頻度が None の場合に頻度が設定されていました (GH 22150)

  • DatetimeIndex の丸めメソッド (round(), ceil(), floor()) と Timestamp の丸めメソッド (round(), ceil(), floor()) で精度が失われる可能性があったバグ (GH 22591)

  • to_datetime() のバグで、Index 引数を指定した場合に結果から name が削除されていました (GH 21697)

  • PeriodIndex のバグで、timedelta または Tick オブジェクトを加算または減算すると誤った結果が生成されていました (GH 22988)

  • 期間dtypeデータを持つ Series reprのバグで、データとインデックスの間にスペースが欠落していました (GH 23601)

  • date_range() のバグで、負の頻度で開始日を過去の終了日に減算すると発生していました (GH 23270)

  • Series.min() のバグで、NaT のシリーズで呼び出された場合に NaT ではなく NaN を返していました (GH 23282)

  • Series.combine_first() のバグで、カテゴリを適切に整列できず、self の欠損値が other の有効な値で埋められませんでした (GH 24147)

  • datetimelike値を持つ DataFrame.combine() のバグで、TypeError が発生していました (GH 23079)

  • date_range() のバグで、Day 以上の頻度で将来の十分に遠い日付が OutOfBoundsDatetime を発生させる代わりに過去に巻き戻ることがありました (GH 14187)

  • period_range() のバグで、startendPeriod オブジェクトとして提供された場合にそれらの頻度が無視されていました (GH 20535)。

  • PeriodIndex のバグで、属性 freq.n が1より大きい場合に DateOffset オブジェクトを追加すると誤った結果が返されていました (GH 23215)

  • Series のバグで、datetimelike値を設定する際に文字列インデックスを文字リストとして解釈していました (GH 23451)

  • DataFrame のバグで、タイムゾーンを持つ Timestamp オブジェクトのndarrayから新しい列を作成すると、タイムゾーン付きdatetimeではなくオブジェクトdtypeの列が作成されていました (GH 23932)

  • Timestamp コンストラクタのバグで、入力された Timestamp の頻度が削除されていました (GH 22311)

  • DatetimeIndex のバグで、np.array(dtindex, dtype=object) を呼び出すと、誤って long オブジェクトの配列が返されていました (GH 23524)

  • Index のバグで、タイムゾーン対応の DatetimeIndexdtype=object を渡すと誤って ValueError が発生していました (GH 23524)

  • Index のバグで、タイムゾーンが不明な DatetimeIndex に対して np.array(dtindex, dtype=object) を呼び出すと、Timestamp オブジェクトの配列ではなく datetime オブジェクトの配列が返され、タイムスタンプのナノ秒部分が失われる可能性がありました (GH 23524)

  • Categorical.__setitem__ のバグで、両方が順序付けされておらず、同じカテゴリを持つが順序が異なる場合に、別の Categorical で設定することができませんでした (GH 24142)

  • date_range() のバグで、ミリ秒以上の分解能を持つ日付を使用すると、誤った値やインデックスの誤った数の値が返される可能性がありました (GH 24110)

  • DatetimeIndex のバグで、Categorical または CategoricalIndex から DatetimeIndex を構築すると、誤ってタイムゾーン情報が削除されていました (GH 18664)

  • DatetimeIndexTimedeltaIndex のバグで、Ellipsis を使用してインデックスを作成すると、誤ってインデックスの freq 属性が失われていました (GH 21282)

  • 渡されたデータの最初の要素が NaTDatetimeIndex に誤った freq 引数を渡した場合に生成されるエラーメッセージが明確化されました (GH 11587)

  • to_datetime() のバグで、単位マッピングの DataFrame または dict を渡した場合に box および utc 引数が無視されていました (GH 23760)

  • Series.dt のバグで、インプレース操作後にキャッシュが適切に更新されませんでした (GH 24408)

  • PeriodIndex のバグで、長さ1の配列ライクなオブジェクトと比較した場合に ValueError が発生しなかったバグ (GH 23078)

  • DatetimeIndex.astype()PeriodIndex.astype()、および TimedeltaIndex.astype() が符号なし整数dtypeの dtype の符号を無視していたバグ (GH 24405)。

  • datetime64[ns]-dtypeの Series.max() が、nullが存在し skipna=False が渡された場合に NaT を返さなかったバグを修正しました (GH 24265)

  • to_datetime() のバグで、タイムゾーン対応とタイムゾーン不明の datetimes の両方を含む datetime オブジェクトの配列が ValueError を発生させなかったバグ (GH 24569)

  • to_datetime() のバグで、無効なdatetime形式の場合に errors='coerce' であっても入力を NaT に強制変換しませんでした (GH 24763)

Timedelta#

  • timedelta64[ns] dtypeの DataFrameTimedelta ライクなスカラで除算される際に、float64 dtypeではなく timedelta64[ns] dtypeを誤って返していたバグ (GH 20088, GH 22163)

  • オブジェクトdtypeの Indextimedelta64[ns] dtypeの Series に追加すると誤ってエラーが発生していたバグを修正しました (GH 22390)

  • 数値dtypeの Seriestimedelta オブジェクトで乗算する際のバグ (GH 22390)

  • 数値dtypeの Seriestimedelta64 dtypeの配列または Series を加算または減算する際のバグ (GH 22390)

  • 数値dtypeの Indextimedelta64 dtypeの配列を乗算または除算する際のバグ (GH 22390)

  • TimedeltaIndex のバグで、Timestamp オブジェクトによるインデックス作成を誤って許可していました (GH 20464)

  • オブジェクトdtypeの配列から Timedelta を減算すると TypeError が発生していたバグを修正しました (GH 21980)

  • すべての timedelta64[ns] dtypeの DataFrame をすべての整数dtypeの DataFrame に追加すると、TypeError を発生させる代わりに誤った結果を返していたバグを修正しました (GH 22696)

  • TimedeltaIndex のバグで、タイムゾーン対応のdatetimeスカラを追加すると、タイムゾーン不明の DatetimeIndex を誤って返していました (GH 23215)

  • TimedeltaIndex のバグで、np.timedelta64('NaT') を追加すると、すべての NaTTimedeltaIndex ではなく、すべての NaTDatetimeIndex を誤って返していました (GH 23215)

  • Timedeltato_timedelta() のバグで、サポートされる単位文字列に不整合がありました (GH 21762)

  • TimedeltaIndex の除算のバグで、別の TimedeltaIndex で除算すると、Float64Index を返す代わりに TypeError が発生していました (GH 23829, GH 22631)

  • TimedeltaIndex の比較演算のバグで、非 Timedelta ライクなオブジェクトと比較した場合に、__eq__ に対してはすべて False を、__ne__ に対してはすべて True を返す代わりに TypeError が発生していました (GH 24056)

  • Timedelta の比較のバグで、Tick オブジェクトと比較した場合に誤って TypeError が発生していました (GH 24710)

タイムゾーン#

  • Index.shift() のバグで、夏時間移行時にシフトすると AssertionError が発生していました (GH 8616)

  • Timestamp コンストラクタのバグで、無効なタイムゾーンオフセット指定子 (Z) を渡しても ValueError が発生しませんでした (GH 8910)

  • Timestamp.replace() のバグで、夏時間境界で置換すると誤ったオフセットが保持されていました (GH 7825)

  • Series.replace() のバグで、datetime64[ns, tz] データで NaT を置換する際に発生していました (GH 11792)

  • Timestamp のバグで、タイムゾーンオフセットを含む異なる文字列日付形式を渡すと、異なるタイムゾーンオフセットが生成されていました (GH 12064)

  • tz-naive Timestamp をtz-aware DatetimeIndex と比較すると、DatetimeIndex がtz-naiveに強制変換されるバグ (GH 12601)

  • tz-aware DatetimeIndex を持つ Series.truncate() のバグで、コアダンプを引き起こしていました (GH 9243)

  • Series コンストラクタのバグで、tz-awareとtz-naiveの Timestamp をtz-awareに強制変換していました (GH 13051)

  • datetime64[ns, tz] dtypeの Index のバグで、整数データを正しくローカライズしていませんでした (GH 20964)

  • DatetimeIndex のバグで、整数とtzを使用して構築すると正しくローカライズされませんでした (GH 12619)

  • tz-aware datetimeの DataFrame.describe()Series.describe()firstlast の結果を表示しなかったバグを修正しました (GH 21328)

  • DatetimeIndex の比較のバグで、タイムゾーン対応の DatetimeIndexnp.datetime64 と比較した場合に TypeError が発生しませんでした (GH 22074)

  • タイムゾーン対応のスカラによる DataFrame 代入のバグ (GH 19843)

  • DataFrame.asof() のバグで、tz-naiveとtz-awareのタイムスタンプを比較しようとすると TypeError が発生していました (GH 21194)

  • 夏時間移行時に replace メソッドで構築された Timestamp を使用して DatetimeIndex を構築する際のバグ (GH 18785)

  • 夏時間移行のある DatetimeIndex を持つ DataFrame.loc() で新しい値を設定する際のバグ (GH 18308, GH 20724)

  • Index.unique() のバグで、tz-awareな日付を正しく再ローカライズしませんでした (GH 21737)

  • 夏時間移行のある Series をインデックス作成する際のバグ (GH 21846)

  • DataFrame.resample()Series.resample() のバグで、タイムゾーン対応時系列が夏時間移行で終わると AmbiguousTimeError または NonExistentTimeError が発生していました (GH 19375, GH 10117)

  • DataFrame.drop()Series.drop() のバグで、夏時間移行のある DatetimeIndex から削除するキーとしてtz-aware Timestampを指定すると発生していました (GH 21761)

  • DatetimeIndex コンストラクタのバグで、NaTdateutil.tz.tzlocalOutOfBoundsDatetime エラーが発生していました (GH 23807)

  • DatetimeIndex.tz_localize()Timestamp.tz_localize() のバグで、夏時間移行付近で dateutil.tz.tzlocal を使用すると誤ってローカライズされたdatetimeが返されていました (GH 23807)

  • Timestamp コンストラクタのバグで、datetime.datetime 引数と一緒に dateutil.tz.tzutc タイムゾーンが渡されると、pytz.UTC タイムゾーンに変換されていました (GH 23807)

  • to_datetime() のバグで、uniterrors='ignore' が指定された場合に utc=True が尊重されませんでした (GH 23758)

  • to_datetime() のバグで、Timestamp を渡した場合に utc=True が尊重されませんでした (GH 24415)

  • DataFrame.any() のバグで、axis=1 でデータがdatetimelike型の場合に誤った値を返していました (GH 23070)

  • DatetimeIndex.to_period() のバグで、タイムゾーン対応インデックスが PeriodIndex を作成する前にまずUTCに変換されていました (GH 22905)

  • DataFrame.tz_localize(), DataFrame.tz_convert(), Series.tz_localize(), および Series.tz_convert() のバグで、copy=False が元の引数をインプレースで変更していました (GH 6326)

  • DataFrame.max() および DataFrame.min()axis=1 を使用した場合にバグが発生していました。すべての列に同じタイムゾーンが含まれている場合、NaN を持つ Series が返されていました (GH 10390)。

オフセット#

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

  • DateOffset で、キーワード引数 weekmilliseconds が受け入れられても無視されるバグがありました。これらの引数を渡すと、ValueError が発生するようになりました (GH 19398)。

  • DateOffsetDataFrame または PeriodIndex に追加すると、誤って TypeError が発生するバグがありました (GH 23215)。

  • DateOffset オブジェクトを非 DateOffset オブジェクト、特に文字列と比較すると、等値チェックで False を返す代わりに ValueError を発生させ、不等値チェックで True を返すバグがありました (GH 23524)。

数値#

  • Series __rmatmul__ が行列ベクトル乗算をサポートしないバグがありました (GH 21530)。

  • factorize() が読み取り専用配列で失敗するバグがありました (GH 12813)。

  • unique() が符号付きゼロを inconsistently 処理するバグが修正されました。一部の入力では 0.0 と -0.0 が等しいものとして扱われ、一部の入力では異なるものとして扱われていました。現在では、すべての入力で等しいものとして扱われます (GH 21866)。

  • DataFrame.agg()DataFrame.transform()、および DataFrame.apply() で、関数のリストと axis=1 (例: df.apply(['sum', 'mean'], axis=1)) が指定された場合に、誤って TypeError が発生するバグがありました。これら 3 つのメソッドすべてで、このような計算は正しく実行されるようになりました。(GH 16679)。

  • Series の datetime-like スカラーおよび配列との比較に関するバグがありました (GH 22074)。

  • DataFrame のブール型 dtype と整数間の乗算が、整数型 dtype の代わりに object dtype を返すバグがありました (GH 22047GH 22163)。

  • DataFrame.apply() で、文字列引数と追加の位置引数またはキーワード引数 (例: df.apply('sum', min_count=1)) が指定された場合に、誤って TypeError が発生するバグがありました (GH 22376)。

  • DataFrame.astype() を拡張 dtype に変換すると AttributeError が発生する可能性のあるバグがありました (GH 22578)。

  • DataFrametimedelta64[ns] dtype と整数 dtype の ndarray を算術演算すると、ndarray を誤って timedelta64[ns] dtype として扱うバグがありました (GH 23114)。

  • Series.rpow() で、1 の代わりに 1 ** NA のオブジェクト dtype NaN が発生するバグがありました (GH 22922)。

  • Series.agg() は、numpy.nansum() のような NumPy の NaN を認識するメソッドを処理できるようになりました (GH 19629)。

  • Series.rank() および DataFrame.rank() で、pct=True と 224 行を超える行が存在する場合に、パーセンテージが 1.0 を超えるバグがありました (GH 18271)。

  • 一意でない CategoricalIndex() を持つ DataFrame.round() のような呼び出しは、期待されるデータを返すようになりました。以前は、データが不適切に重複していました (GH 21809)。

  • DataFrame.eval() でサポートされる関数リストに log10floorceil が追加されました (GH 24139GH 24353)。

  • SeriesIndex 間の論理演算 &, |, ^ は、ValueError を発生させなくなりました (GH 22092)。

  • is_scalar() 関数で PEP 3141 の数値をチェックすると True が返されます (GH 22903)。

  • Series.sum() のような削減メソッドは、NumPy ufunc から呼び出されたときに TypeError を発生させるのではなく、keepdims=False のデフォルト値を受け入れるようになりました。keepdims の完全なサポートは実装されていません (GH 24356)。

変換#

  • DataFrame.combine_first() で、列の型が予期せず float に変換されるバグがありました (GH 20699)。

  • DataFrame.clip() で、列の型が保持されず float にキャストされるバグがありました (GH 24162)。

  • DataFrame.clip() で、データフレームの列の順序が一致しない場合に、数値が間違って観察されるバグがありました (GH 20911)。

  • DataFrame.astype() で、重複する列名が存在する場合に拡張 dtype に変換すると RecursionError が発生するバグがありました (GH 24704)。

文字列#

  • Index.str.partition() が NaN セーフではなかったバグがありました (GH 23558)。

  • Index.str.split() が NaN セーフではなかったバグがありました (GH 23677)。

  • Series.str.contains()Categorical dtype Seriesna 引数を尊重しないバグがありました (GH 22158)。

  • Index.str.cat() で、結果に NaN のみが含まれていた場合のバグがありました (GH 24044)。

Interval#

  • IntervalIndex コンストラクタで、closed パラメータが推論された closed を常にオーバーライドしないバグがありました (GH 19370)。

  • IntervalIndex repr で、間隔のリストの後に末尾のカンマが欠落していたバグがありました (GH 20611)。

  • Interval で、スカラー算術演算が closed 値を保持しないバグがありました (GH 22313)。

  • IntervalIndex で、datetime-like 値でインデックス付けすると KeyError が発生するバグがありました (GH 20636)。

  • IntervalTree で、NaN を含むデータが警告をトリガーし、IntervalIndex を使用した誤ったインデックスクエリにつながるバグがありました (GH 23352)。

インデックス付け#

  • DataFrame.ne() で、列に列名 "dtype" が含まれている場合に失敗するバグがありました (GH 22383)。

  • .loc に単一の欠落ラベルを要求したときに発生する KeyError のトレースバックが短く、より明確になりました (GH 21557)。

  • PeriodIndex は、形式が誤った文字列が検索されたときに KeyError を発生させるようになりました。これは DatetimeIndex の動作と一貫しています (GH 22803)。

  • MultiIndex の最初のレベルが整数型の場合に、.ix が欠落した整数ラベルを要求すると、位置インデックスにフォールバックするのではなく、フラットな Int64Index の場合と一貫して KeyError を発生させるようになりました (GH 21593)。

  • Index.reindex() で、タイムゾーンなしとタイムゾーンありの DatetimeIndex を再インデックス付けする際のバグがありました (GH 8306)。

  • Series.reindex() で、datetime64[ns, tz] dtype を持つ空の Series を再インデックス付けする際のバグがありました (GH 20869)。

  • DataFrame で、.loc とタイムゾーン対応の DatetimeIndex を使用して値を設定する際のバグがありました (GH 11365)。

  • DataFrame.__getitem__ は、Series.__getitem__ と一貫して、ラベルのリストのような辞書と辞書キーを受け入れるようになりました (GH 21294)。

  • 列が一意でない場合の DataFrame[np.nan] のバグが修正されました (GH 21428)。

  • ナノ秒分解能の日付とタイムゾーンを持つ DatetimeIndex をインデックス付けする際のバグがありました (GH 11679)。

  • 負の値を含む Numpy 配列でインデックス付けすると、インデクサが変更されるバグがありました (GH 21867)。

  • 混合インデックスで .at に整数を使用できないバグがありました (GH 19860)。

  • Float64Index.get_loc は、ブールキーが渡されたときに KeyError を発生させるようになりました (GH 19087)。

  • DataFrame.loc() で、IntervalIndex を使用してインデックス付けする際のバグがありました (GH 19977)。

  • IndexNoneNaN、および NaT をもはや mangling しなくなりました。つまり、これらは 3 つの異なるキーとして扱われます。ただし、数値インデックスの場合、これら 3 つはすべて依然として NaN に強制されます (GH 22332)。

  • スカラーが float で、Index が整数 dtype の場合に scalar in Index でバグがありました (GH 22085)。

  • MultiIndex.set_levels() で、レベル値が添字付けできない場合のバグがありました (GH 23273)。

  • Index によって timedelta 列を設定すると、double にキャストされ、精度が失われるバグがありました (GH 23511)。

  • Index.union() および Index.intersection() で、特定の場合に結果の Index の名前が正しく計算されないバグがありました (GH 9943GH 9862)。

  • ブール型 IndexIndex をスライスすると TypeError が発生する可能性のあるバグがありました (GH 22533)。

  • PeriodArray.__setitem__ で、スライスとリストのような値を受け入れる際のバグがありました (GH 23978)。

  • DatetimeIndexTimedeltaIndex で、Ellipsis でインデックス付けすると freq 属性が失われるバグがありました (GH 21282)。

  • iat で、互換性のない値を割り当てると新しい列が作成されるバグがありました (GH 23236)。

欠損値#

  • DataFrame.fillna() で、1 つの列に datetime64[ns, tz] dtype が含まれている場合に ValueError が発生するバグがありました (GH 15522)。

  • Series.hasnans() で、初期呼び出し後に null 要素が導入された場合に誤ってキャッシュされ、誤った結果を返す可能性のあるバグがありました (GH 19700)。

  • Series.isin() は、np.object_-dtype の場合でも、すべての NaN-float を等しいものとして扱うようになりました。この動作は float64 の動作と一貫しています (GH 22119)。

  • unique() は、np.object_-dtype の NaN-float と NaT-object をもはや mangling しなくなりました。つまり、NaT は NaN-値に強制されなくなり、異なるエンティティとして扱われます (GH 22295)。

  • DataFrame および Series は、ハードニングされたマスクを持つ NumPy マスク配列を適切に処理するようになりました。以前は、ハードマスクを持つマスク配列から DataFrame または Series を構築すると、期待される NaN ではなく、基になる値を含む pandas オブジェクトが作成されていました (GH 24574)。

  • DataFrame コンストラクタで、NumPy マスクレコード配列を処理する際に dtype 引数が尊重されないバグがありました (GH 24874)。

MultiIndex#

  • io.formats.style.Styler.applymap() で、MultiIndex スライスを含む subset=Series に縮小されるバグがありました (GH 19861)。

  • バージョン 0.8.0 以前の MultiIndex ピクルスの互換性が削除されました。バージョン 0.13 以降の MultiIndex ピクルスとの互換性は維持されています (GH 21654)。

  • MultiIndex.get_loc_level() (および結果として、MultiIndex インデックスを持つ Series または DataFrame.loc) は、levels に存在するが使用されていないラベルを要求された場合に、空の slice を返すのではなく、KeyError を発生させるようになりました (GH 22221)。

  • MultiIndexMultiIndex.from_frame() が追加され、DataFrame から MultiIndex オブジェクトを構築できるようになりました (GH 22420)。

  • Python 3 で MultiIndex を作成する際に、一部のレベルが混合型である場合 (例: 一部のラベルがタプルである場合) に発生する TypeError が修正されました (GH 15457)。

IO#

  • read_csv() で、ブールカテゴリの CategoricalDtype で指定された列が、文字列値からブール値に正しく強制型変換されないバグがありました (GH 20498)。

  • read_csv() で、Python 2.x でユニコード列名が正しく認識されないバグがありました (GH 13253)。

  • DataFrame.to_sql() で、タイムゾーン対応データ (datetime64[ns, tz] dtype) を書き込むと TypeError が発生するバグがありました (GH 9086)。

  • DataFrame.to_sql() で、タイムゾーンなしの DatetimeIndex が、サポートされているデータベース (例: PostgreSQL) で TIMESTAMP WITH TIMEZONE 型として書き込まれるバグがありました (GH 23510)。

  • read_excel() で、空のデータセットで parse_cols が指定された場合のバグがありました (GH 9208)。

  • read_html() は、skiprows および header 引数を考慮する際に、<thead> 内のすべての空白 <tr> を無視しなくなりました。以前は、ユーザーはこの問題に対処するために、このようなテーブルで header および skiprows の値を減らす必要がありました (GH 21641)。

  • read_excel() は、以前に非推奨とされた sheetname の非推奨警告を正しく表示するようになりました (GH 17994)。

  • read_csv() および read_table() は、エンコードが不正な文字列で UnicodeError をスローし、コアダンプしなくなりました (GH 22748)。

  • read_csv() は、タイムゾーン対応の datetime を正しく解析するようになりました (GH 22256)。

  • read_csv() で、データがチャンクで読み取られているときに、C エンジンのメモリ管理が時期尚早に最適化されるバグがありました (GH 23509)。

  • read_csv() で、マルチインデックスを抽出する際に、名前のない列が誤って識別されるバグがありました (GH 23687)。

  • read_sas() は、幅が 8 バイト未満の sas7bdat ファイル内の数値を正しく解析するようになりました (GH 21616)。

  • read_sas() は、多数の列を持つ sas7bdat ファイルを正しく解析するようになりました (GH 22628)。

  • read_sas() は、ビット 7 も設定されている (したがってページタイプが 128 + 256 = 384 である) データページタイプを持つ sas7bdat ファイルを正しく解析するようになりました (GH 16615)。

  • read_sas() で、無効なファイル形式で誤ったエラーが報告されるバグがありました (GH 24548)。

  • detect_client_encoding() で、stdout へのアクセスが制限されているために mod_wsgi プロセスでインポートする際に、潜在的な IOError が処理されないバグがありました (GH 21552)。

  • DataFrame.to_html()index=False を指定した場合に、切り詰められた DataFrame の切り詰めインジケータ (...) が欠落するバグがありました (GH 15019GH 22783)。

  • DataFrame.to_html()index=False を指定した場合に、列と行インデックスの両方が MultiIndex であるバグがありました (GH 22579)。

  • DataFrame.to_html()index_names=False を指定した場合に、インデックス名が表示されるバグがありました (GH 22747)。

  • DataFrame.to_html()header=False を指定した場合に、行インデックス名が表示されないバグがありました (GH 23788)。

  • DataFrame.to_html()sparsify=False を指定すると TypeError が発生するバグがありました (GH 22887)。

  • DataFrame.to_string() で、index=False で、最初の列の値の幅が最初の列のヘッダーの幅よりも大きい場合に、列の配置が壊れるバグがありました (GH 16839GH 13032)。

  • DataFrame.to_string() で、DataFrame の表現がウィンドウ全体を占めないバグがありました (GH 22984)。

  • DataFrame.to_csv() で、単一レベルの MultiIndex が誤ってタプルを書き込むバグがありました。現在では、インデックスの値のみが書き込まれます (GH 19589)。

  • HDFStore は、コンストラクタに format kwarg が渡されたときに ValueError を発生させるようになりました (GH 13291)。

  • HDFStore.append() で、空の文字列列と min_itemsize < 8 を持つ DataFrame を追加する際のバグがありました (GH 12242)。

  • read_csv() で、完了時またはエラー時のクリーンアップが不十分なために、C エンジンで NaN 値を解析する際にメモリリークが発生するバグがありました (GH 21353)。

  • read_csv() で、skipfooternrowsiterator、または chunksize と一緒に渡されたときに、誤ったエラーメッセージが報告されるバグがありました (GH 23711)。

  • read_csv() で、MultiIndex インデックス名が提供されていない場合に不適切に処理されるバグがありました (GH 23484)。

  • read_csv() で、方言の値がデフォルトの引数と競合する場合に不要な警告が報告されるバグがありました (GH 23761)。

  • read_html() で、無効なフレーバーが指定されたときに、エラーメッセージが有効なフレーバーを表示しないバグがありました (GH 23549)。

  • read_excel() で、ヘッダー名が指定されていない場合でも、余分なヘッダー名が抽出されるバグがありました (GH 11733)。

  • read_excel() で、Python 2.x で列名が文字列に正しく変換されないことがあるバグがありました (GH 23874)。

  • read_excel() で、index_col=None が尊重されず、インデックス列が解析されるバグがありました (GH 18792GH 20480)。

  • read_excel() で、usecols が文字列として渡されたときに、適切な列名が検証されないバグがありました (GH 20480)。

  • DataFrame.to_dict() で、数値データの場合に結果の dict に非 Python スカラーが含まれるバグがありました (GH 23753)。

  • DataFrame.to_string()DataFrame.to_html()DataFrame.to_latex() は、float_format 引数として文字列が渡された場合に、出力を正しくフォーマットするようになりました (GH 21625GH 22270)。

  • read_csv() で、整数インデックス列で 'inf' を na_value として使用しようとすると OverflowError が発生するバグがありました (GH 17128)。

  • read_csv() で、Windows 上の Python 3.6+ の C エンジンがアクセント付き文字または特殊文字を含む CSV ファイル名を不適切に読み取るバグがありました (GH 15086)。

  • read_fwf() で、ファイルの圧縮タイプが正しく推論されないバグがありました (GH 22199)。

  • pandas.io.json.json_normalize() で、record_path の連続する 2 つの要素が dict の場合に TypeError が発生するバグがありました (GH 22706)。

  • DataFrame.to_stata()pandas.io.stata.StataWriter、および pandas.io.stata.StataWriter117 で、例外が発生すると部分的に書き込まれた無効な dta ファイルが残るバグがありました (GH 23573)。

  • DataFrame.to_stata() および pandas.io.stata.StataWriter117 で、非 ASCII 文字を含む strL を使用すると無効なファイルが生成されるバグがありました (GH 23573)。

  • HDFStore で、Python 2 で書き込まれた固定形式の Dataframe を Python 3 で読み込むと ValueError が発生するバグがありました (GH 24510)。

  • DataFrame.to_string() と、より一般的には浮動小数点 repr フォーマッタでバグがありました。列に inf が存在する場合、ゼロがトリムされず、NA 値の場合にはトリムされていました。現在では、NA が存在する場合と同様にゼロがトリムされます (GH 24861)。

  • 列の数を切り詰める際に、最後の列の幅が広い場合の repr のバグがありました (GH 24849)。

プロット#

  • DataFrame.plot.scatter() および DataFrame.plot.hexbin() で、IPython インラインバックエンドでカラーバーがオンの場合に、x 軸ラベルとティックラベルが消えるバグがありました (GH 10611GH 10678、および GH 20455)。

  • matplotlib.axes.Axes.scatter() を使用して datetime を含む Series をプロットする際のバグがありました (GH 22039)。

  • DataFrame.plot.bar() で、棒が単一の色ではなく複数の色を使用するバグがありました (GH 20585)。

  • カラーパラメータを検証する際に、余分な色が与えられたカラー配列に追加されるバグがありました。これは、matplotlib を使用する複数のプロット関数で発生しました (GH 20726)。

GroupBy/resample/rolling#

  • Rolling.min() および Rolling.max() で、closed='left'、datetime-like インデックス、および Series に 1 つのエントリしかない場合にセグメンテーション違反が発生するバグがありました (GH 24718)。

  • GroupBy.first() および GroupBy.last() で、as_index=False を指定するとタイムゾーン情報が失われるバグがありました (GH 15884)。

  • DateFrame.resample() で、DST 境界をまたいでダウンサンプリングする際のバグがありました (GH 8531)。

  • DateFrame.resample() で、n > 1 の場合にオフセット Day を使用した日付アンカーのバグがありました (GH 24127)。

  • グループ化変数が NaN のみを含み、numpy バージョンが 1.13 未満の場合に SeriesGroupBySeriesGroupBy.count() メソッドを呼び出すと、ValueError が誤って発生するバグがありました (GH 21956)。

  • Rolling.min() で、closed='left' と datetime-like インデックスを使用した場合に、誤った結果とセグメンテーション違反につながる複数のバグがありました (GH 21704)。

  • Resampler.apply() で、適用された関数に位置引数を渡す際のバグがありました (GH 14615)。

  • Series.resample() で、loffset kwarg に numpy.timedelta64 を渡す際のバグがありました (GH 7687)。

  • Resampler.asfreq() で、TimedeltaIndex の頻度が新しい頻度のサブ期間である場合のバグがありました (GH 13022)。

  • SeriesGroupBy.mean() で、値が整数であったが int64 に収まらず、代わりにオーバーフローするバグがありました (GH 22487)。

  • RollingGroupby.agg() および ExpandingGroupby.agg() は、パラメータとして複数の集計関数をサポートするようになりました (GH 15072)。

  • DataFrame.resample() および Series.resample() で、DST 遷移をまたいで週次オフセット ('W') でリサンプリングする際のバグがありました (GH 9119GH 21459)。

  • DataFrame.expanding() で、集計中に axis 引数が尊重されないバグがありました (GH 23372)。

  • GroupBy.transform() で、入力関数が DataFrame を受け入れるが名前を変更する場合に、欠損値が発生するバグがありました (GH 23455)。

  • GroupBy.nth() で、列の順序が常に保持されないバグがありました (GH 20760)。

  • GroupBy.rank() で、method='dense' および pct=True を指定し、グループにメンバーが 1 人しかいない場合に ZeroDivisionError が発生するバグがありました (GH 23666)。

  • 空のグループと pct=TrueGroupBy.rank() を呼び出すと ZeroDivisionError が発生していました (GH 22519)。

  • DataFrame.resample() で、TimeDeltaIndexNaT をリサンプリングする際のバグがありました (GH 13223)。

  • DataFrame.groupby() で、列を選択する際に observed 引数が尊重されず、常に observed=False が使用されるバグがありました (GH 23970)。

  • SeriesGroupBy.pct_change() または DataFrameGroupBy.pct_change() は、以前はパーセンテージ変更を計算する際にグループ全体で機能していましたが、現在はグループごとに正しく機能するようになりました (GH 21200GH 21235)。

  • 非常に大きな数 (2^32) の行でハッシュテーブルの作成を妨げるバグがありました (GH 22805)。

  • カテゴリカルでグループ化する際に、observed=True でカテゴリカル列に nan が存在すると、ValueError が発生し、グループ化が誤るバグがありました (GH 24740GH 21151)。

再整形#

  • pandas.concat() で、タイムゾーン対応インデックスを持つリサンプリングされた DataFrame を結合する際のバグがありました (GH 13783)。

  • pandas.concat() で、Series のみを結合する際に、concatnames 引数が無視されなくなったバグがありました (GH 23490)。

  • Series.combine_first() で、datetime64[ns, tz] dtype を使用すると tz-naive な結果が返されるバグがありました (GH 21469)。

  • Series.where() および DataFrame.where() で、datetime64[ns, tz] dtype を使用する際のバグがありました (GH 21546)。

  • DataFrame.where() で、空の DataFrame と非ブール型 dtype を持つ空の cond を使用する際のバグがありました (GH 21947)。

  • Series.mask() および DataFrame.mask() で、list 条件を使用する際のバグがありました (GH 21891)。

  • DataFrame.replace() において、OutOfBounds datetime64[ns, tz] を変換する際に RecursionError を発生させるバグ (GH 20380)

  • GroupBy.rank() は、引数 na_option に無効な値が渡された場合、ValueError を発生させるようになりました (GH 22124)

  • Python 2 で Unicode 属性を持つ get_dummies() のバグ (GH 22084)

  • DataFrame.replace() において、空のリストを置換する際に RecursionError を発生させるバグ (GH 22083)

  • Series.replace() および DataFrame.replace() において、to_replace の値として辞書を使用し、辞書内の1つのキーが別のキーの値である場合、整数キーと文字列キーの使用間で結果が不整合になるバグ (GH 20656)

  • 空の DataFrame に対する DataFrame.drop_duplicates() で、誤ってエラーが発生するバグ (GH 20516)

  • pandas.wide_to_long() において、stubnames 引数に文字列が渡され、かつ列名がそのstubnameのサブストリングである場合のバグ (GH 22468)

  • DST遷移を含む datetime64[ns, tz] データを結合する際の merge() のバグ (GH 18885)

  • 定義された許容範囲内の浮動小数点値で結合する際の merge_asof() のバグ (GH 22981)

  • タイムゾーン対応データを持つ複数列のDataFrameを異なる列数を持つDataFrameと連結する際の pandas.concat() のバグ (GH 22796)

  • 欠損値との結合を試みる際に誤解を招くエラーメッセージが発生する merge_asof() のバグ (GH 23189)

  • 列に MultiIndex を持つDataFrameに対する DataFrame.nsmallest()DataFrame.nlargest() のバグ (GH 23033)。

  • DataFrame に存在しない列名を渡す際の pandas.melt() のバグ (GH 23575)

  • dateutilタイムゾーンを持つ Series を使用した DataFrame.append()TypeError が発生するバグ (GH 23682)

  • データなしで dtype=str を渡す際の Series コンストラクションのバグ (GH 22477)

  • 重複する IntervalIndex として bins を指定した cut() で、ValueError を発生させる代わりに、複数のビンがアイテムごとに返されるバグ (GH 23980)

  • Series の datetimetz と Series のカテゴリを結合する際の pandas.concat() でタイムゾーンが失われるバグ (GH 23816)

  • 部分的なMultiIndexで結合する際に名前が削除される DataFrame.join() のバグ (GH 20452)。

  • DataFrame.nlargest() および DataFrame.nsmallest() は、keep != 'all' の場合でも、最初の列で同点の場合に正しい n 値を返すようになりました (GH 22752)

  • 既存の Index のインスタンスではないインデックス引数でDataFrameを構築する際に問題が発生していました (GH 22227)。

  • DataFrame のバグにより、list のサブクラスを構築に使用できないようにしていました (GH 21226)

  • DataFrame.unstack() および DataFrame.pivot_table() で、結果のDataFrameがint32で扱える要素数を超える場合に誤解を招くエラーメッセージが返されるバグ。現在、エラーメッセージは改善され、実際の問題を指し示すようになりました (GH 20601)

  • タイムゾーン対応の値をアンスタックする際に ValueError が発生する DataFrame.unstack() のバグ (GH 18338)

  • タイムゾーン対応の値がタイムゾーン非対応の値に変換される DataFrame.stack() のバグ (GH 19420)

  • by_col がタイムゾーン対応の値である場合に TypeError が発生する merge_asof() のバグ (GH 21184)

  • DataFrame 構築中にエラーが発生した際に誤った形状が表示されるバグ。 (GH 20742)

スパース#

  • ブール値、datetime、またはtimedelta列をSparseに更新できるようになりました (GH 22367)

  • すでにスパースデータを保持している Series で Series.to_sparse() が正しく構築されないバグ (GH 22389)

  • SparseArray コンストラクタに sparse_index を指定した場合、すべてのデータ型で na 値が np.nan にデフォルトで設定されなくなりました。data.dtype に適した na_value が使用されます。

  • SparseArray.nbytes で、そのスパースインデックスのサイズを含めないことでメモリ使用量を少なく報告するバグ。

  • 非NA fill_valueSeries.shift() のパフォーマンスが向上しました。値が密な配列に変換されなくなりました。

  • スパース列でグループ化する際に、非NA fill_value のグループに fill_value が含まれない DataFrame.groupby のバグ (GH 5078)

  • ブール値を持つ SparseSeries で単項反転演算子 (~) のバグ。このパフォーマンスも改善されました (GH 22835)

  • 一意の値を返さない SparseArary.unique() のバグ (GH 19595)

  • シフトされた/不正確な結果を返す SparseArray.nonzero() および SparseDataFrame.dropna() のバグ (GH 21172)

  • dtypes がスパース性を失う DataFrame.apply() のバグ (GH 23744)

  • すべてのスパース値を持つ Series のリストを連結する際に fill_value を変更し、密な Series に変換する concat() のバグ (GH 24371)

スタイル#

  • background_gradient() は、背景色の輝度に基づいてテキストの色を自動的に明るくする text_color_threshold パラメータを受け取るようになりました。これにより、背景のカラーマップ範囲を制限する必要なく、暗い背景色での可読性が向上します。 (GH 21258)

  • background_gradient() は、axis=None でテーブル全体への適用もサポートするようになりました (行単位および列単位に加えて) (GH 15204)

  • bar() は、axis=None でテーブル全体への適用もサポートし、vmin および vmax でクリッピング範囲を設定できるようになりました (行単位および列単位に加えて) (GH 21548 および GH 21526)。NaN 値も適切に処理されます。

ビルドの変更#

その他#

  • C変数が外部リンケージで宣言されていたため、特定の他のCライブラリが pandas の前にインポートされるとインポートエラーが発生するバグがありました。 (GH 24113)

貢献者#

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

  • AJ Dyka +

  • AJ Pryor, Ph.D +

  • Aaron Critchley

  • Adam Hooper

  • Adam J. Stewart

  • Adam Kim

  • Adam Klimont +

  • Addison Lynch +

  • Alan Hogue +

  • Alex Radu +

  • Alex Rychyk

  • Alex Strick van Linschoten +

  • Alex Volkov +

  • Alexander Buchkovsky

  • Alexander Hess +

  • Alexander Ponomaroff +

  • Allison Browne +

  • Aly Sivji

  • Andrew

  • Andrew Gross +

  • Andrew Spott +

  • Andy +

  • Aniket uttam +

  • Anjali2019 +

  • Anjana S +

  • Antti Kaihola +

  • Anudeep Tubati +

  • Arjun Sharma +

  • Armin Varshokar

  • Artem Bogachev

  • ArtinSarraf +

  • Barry Fitzgerald +

  • Bart Aelterman +

  • Ben James +

  • Ben Nelson +

  • Benjamin Grove +

  • Benjamin Rowell +

  • Benoit Paquet +

  • Boris Lau +

  • Brett Naul

  • Brian Choi +

  • C.A.M. Gerlach +

  • Carl Johan +

  • Chalmer Lowe

  • Chang She

  • Charles David +

  • Cheuk Ting Ho

  • Chris

  • Chris Roberts +

  • クリストファー・ウィーラン

  • Chu Qing Hao +

  • Da Cheezy Mobsta +

  • Damini Satya

  • Daniel Himmelstein

  • Daniel Saxton +

  • Darcy Meyer +

  • DataOmbudsman

  • David Arcos

  • David Krych

  • Dean Langsam +

  • Diego Argueta +

  • Diego Torres +

  • Dobatymo +

  • Doug Latornell +

  • Dr. Irv

  • Dylan Dmitri Gray +

  • Eric Boxer +

  • Eric Chea

  • Erik +

  • Erik Nilsson +

  • Fabian Haase +

  • Fabian Retkowski

  • Fabien Aulaire +

  • Fakabbir Amin +

  • Fei Phoon +

  • Fernando Margueirat +

  • Florian Müller +

  • Fábio Rosado +

  • Gabe Fernando

  • Gabriel Reid +

  • Giftlin Rajaiah

  • Gioia Ballin +

  • Gjelt

  • Gosuke Shibahara +

  • Graham Inggs

  • ギョーム・ゲイ

  • Guillaume Lemaitre +

  • Hannah Ferchland

  • Haochen Wu

  • Hubert +

  • HubertKl +

  • HyunTruth +

  • Iain Barr

  • Ignacio Vergara Kausel +

  • Irv Lustig +

  • IsvenC +

  • Jacopo Rota

  • Jakob Jarmar +

  • James Bourbeau +

  • James Myatt +

  • James Winegar +

  • Jan Rudolph

  • Jared Groves +

  • Jason Kiley +

  • Javad Noorbakhsh +

  • Jay Offerdahl +

  • ジェフ・リーバック

  • Jeongmin Yu +

  • ジェレミー・シェンデル

  • Jerod Estapa +

  • Jesper Dramsch +

  • Jim Jeon +

  • Joe Jevnik

  • Joel Nothman

  • Joel Ostblom +

  • Jordi Contestí

  • Jorge López Fueyo +

  • Joris Van den Bossche

  • Jose Quinones +

  • Jose Rivera-Rubio +

  • ジョシュ

  • Jun +

  • Justin Zheng +

  • Kaiqi Dong +

  • Kalyan Gokhale

  • Kang Yoosam +

  • Karl Dunkle Werner +

  • Karmanya Aggarwal +

  • Kevin Markham +

  • ケビン・シェパード

  • Kimi Li +

  • Koustav Samaddar +

  • Krishna +

  • Kristian Holsheimer +

  • Ksenia Gueletina +

  • Kyle Prestel +

  • LJ +

  • LeakedMemory +

  • Li Jin +

  • Licht Takeuchi

  • Luca Donini +

  • Luciano Viola +

  • Mak Sze Chun +

  • Marc Garcia

  • Marius Potgieter +

  • Mark Sikora +

  • Markus Meier +

  • Marlene Silva Marchena +

  • Martin Babka +

  • MatanCohe +

  • Mateusz Woś +

  • Mathew Topper +

  • Matt Boggess +

  • Matt Cooper +

  • Matt Williams +

  • Matthew Gilbert

  • Matthew Roeschke

  • Max Kanter

  • Michael Odintsov

  • Michael Silverstein +

  • Michael-J-Ward +

  • Mickaël Schoentgen +

  • Miguel Sánchez de León Peque +

  • Ming Li

  • Mitar

  • Mitch Negus

  • Monson Shao +

  • Moonsoo Kim +

  • モルタダ・メヒヤル

  • Myles Braithwaite

  • Nehil Jain +

  • Nicholas Musolino +

  • Nicolas Dickreuter +

  • Nikhil Kumar Mengani +

  • Nikoleta Glynatsi +

  • Ondrej Kokes

  • Pablo Ambrosio +

  • Pamela Wu +

  • Parfait G +

  • Patrick Park +

  • Paul

  • Paul Ganssle

  • Paul Reidy

  • Paul van Mulbregt +

  • Phillip Cloud

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

  • Piyush Aggarwal +

  • Prabakaran Kumaresshan +

  • Pulkit Maloo

  • Pyry Kovanen

  • Rajib Mitra +

  • Redonnet Louis +

  • Rhys Parry +

  • Rick +

  • Robin

  • Roei.r +

  • RomainSa +

  • Roman Imankulov +

  • Roman Yurchak +

  • Ruijing Li +

  • Ryan +

  • Ryan Nazareth +

  • Rüdiger Busche +

  • SEUNG HOON, SHIN +

  • Sandrine Pataut +

  • Sangwoong Yoon

  • Santosh Kumar +

  • Saurav Chakravorty +

  • Scott McAllister +

  • Sean Chan +

  • Shadi Akiki +

  • Shengpu Tang +

  • Shirish Kadam +

  • Simon Hawkins +

  • Simon Riddell +

  • Simone Basso

  • Sinhrks

  • Soyoun(Rose) Kim +

  • Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) +

  • Stefaan Lippens +

  • Stefano Cianciulli

  • Stefano Miccoli +

  • Stephen Childs

  • Stephen Pascoe

  • Steve Baker +

  • Steve Cook +

  • Steve Dower +

  • Stéphan Taljaard +

  • Sumin Byeon +

  • Sören +

  • Tamas Nagy +

  • Tanya Jain +

  • Tarbo Fukazawa

  • Thein Oo +

  • Thiago Cordeiro da Fonseca +

  • ティエリー・モワザン

  • Thiviyan Thanapalasingam +

  • Thomas Lentali +

  • Tim D. Smith +

  • Tim Swast

  • Tom Augspurger

  • Tomasz Kluczkowski +

  • Tony Tao +

  • Triple0 +

  • Troels Nielsen +

  • Tuhin Mahmud +

  • Tyler Reddy +

  • Uddeshya Singh

  • Uwe L. Korn +

  • Vadym Barda +

  • Varad Gunjal +

  • Victor Maryama +

  • Victor Villas

  • Vincent La

  • Vitória Helena +

  • Vu Le

  • Vyom Jain +

  • Weiwen Gu +

  • Wenhuan

  • ウェス・ターナー

  • Wil Tan +

  • ウィリアム・エイド

  • Yeojin Kim +

  • Yitzhak Andrade +

  • Yuecheng Wu +

  • Yuliya Dovzhenko +

  • Yury Bayda +

  • Zac Hatfield-Dodds +

  • aberres +

  • aeltanawy +

  • ailchau +

  • alimcmaster1

  • alphaCTzo7G +

  • amphy +

  • araraonline +

  • azure-pipelines[bot] +

  • benarthur91 +

  • bk521234 +

  • cgangwar11 +

  • クリス・B1

  • cxl923cc +

  • dahlbaek +

  • dannyhyunkim +

  • darke-spirits +

  • david-liu-brattle-1

  • davidmvalente +

  • deflatSOCO

  • doosik_bae +

  • dylanchase +

  • eduardo naufel schettino +

  • euri10 +

  • evangelineliu +

  • fengyqf +

  • fjdiod

  • fl4p +

  • fleimgruber +

  • ジーエフヤング

  • h-vetinari

  • harisbal +

  • henriqueribeiro +

  • himanshu awasthi

  • hongshaoyang +

  • igorfassen +

  • jalazbe +

  • jbrockmendel

  • jh-wu +

  • justinchan23 +

  • louispotok

  • marcosrullan +

  • miker985

  • nicolab100 +

  • nprad

  • nsuresh +

  • ottiP

  • pajachiet +

  • raguiar2 +

  • ratijas +

  • realead +

  • robbuckley +

  • saurav2608 +

  • sideeye +

  • ssikdar1

  • svenharris +

  • syutbai +

  • testvinder +

  • thatneat

  • tmnhat2001

  • tomascassidy +

  • tomneep

  • topper-123

  • vkk800 +

  • winlu +

  • ym-pett +

  • yrhooke +

  • ywpark1 +

  • zertrin

  • zhezherun +