0.24.0 の新機能 (2019年1月25日)#
警告
0.24.x 系列のリリースは、Python 2 をサポートする最後のリリースとなります。今後の機能リリースは、Python 3 のみをサポートします。詳細については、Python 2.7 のサポート終了を参照してください。
これは 0.23.4 からのメジャーリリースで、多数のバグ修正に加え、API の変更、新機能、機能強化、パフォーマンス改善が含まれています。
主な機能は以下の通りです。
これらは pandas 0.24.0 の変更点です。他のバージョンの pandas を含む完全な変更ログについては、リリースノートを参照してください。
機能強化#
オプションの整数 NA サポート#
pandas は、欠損値を持つ整数 dtype を保持する機能を追加しました。この長らく要望されていた機能は、拡張型を使用することで可能になります。
注
IntegerArray は現在実験中です。その API または実装は予告なく変更される可能性があります。
指定された dtype でSeriesを構築できます。dtype 文字列Int64は pandas ExtensionDtypeです。従来の欠損値マーカーであるnp.nanを使用してリストまたは配列を指定すると、整数 dtype に推論されます。Seriesの表示も、文字列出力で欠損値を示すためにNaNを使用します。( GH 20700、 GH 20747、 GH 22441、 GH 21789、 GH 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.arrayとIndex.arrayが、SeriesまたはIndexの基になる配列を抽出するために追加されました。( GH 19954、 GH 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 に保存する#
IntervalとPeriodデータは、以前と同様にIntervalIndexおよびPeriodIndexに加えて、SeriesまたはDataFrameに保存できるようになりました。( GH 19453、 GH 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]
詳細については、名前変更に関する詳細ドキュメントを参照してください。
その他の機能強化#
merge()は、Seriesオブジェクトを事前にDataFrameに変換することなく、DataFrame型と名前付きSeries型のオブジェクト間のマージを直接許可するようになりました (GH 21220)ExcelWriterはmodeをキーワード引数として受け入れるようになり、openpyxlエンジンを使用する際に既存のワークブックに追記できるようになりました ( GH 3441)FrozenListに.union()および.difference()メソッドが追加されました。この機能により、特定の列を明示的に除外するグループ化が大幅に簡素化されます。詳細については、オブジェクトをグループに分割するを参照してください (GH 15475、 GH 15506)。DataFrame.to_parquet()はindexを引数として受け入れるようになり、ユーザーはエンジンのデフォルトの動作を上書きして、結果の Parquet ファイルにデータフレームのインデックスを含めるか除外するかを指定できるようになりました。( GH 20768)read_feather()はcolumnsを引数として受け入れるようになり、ユーザーは読み込む列を指定できるようになりました。( GH 24025)DataFrame.corr()とSeries.corr()は、相関の汎用的な計算方法、例えばヒストグラム交差に callable を受け入れるようになりました (GH 22684)DataFrame.to_string()はdecimalを引数として受け入れるようになり、ユーザーは出力に使用する小数点区切り文字を指定できるようになりました。( GH 23614)DataFrame.to_html()はrender_linksを引数として受け入れるようになり、ユーザーはDataFrameに表示されるURLへのリンクを含むHTMLを生成できるようになりました。使用例については、IO ドキュメントのHTML書き込みのセクションを参照してください。( GH 2679)pandas.read_csv()は、dtypeの引数として pandas 拡張型をサポートするようになり、CSV を読み込む際に pandas 拡張型を使用できるようになりました。( GH 23228)shift()メソッドはfill_valueを引数として受け入れるようになり、ユーザーは空の期間に NA/NaT の代わりに使用される値を指定できるようになりました。( GH 15486)to_datetime()は、formatに渡されたときに%Zおよび%zディレクティブをサポートするようになりました (GH 13486)Series.mode()とDataFrame.mode()はdropnaパラメータをサポートするようになり、NaN/NaT値を考慮するかどうかを指定するために使用できます (GH 17534)DataFrame.to_csv()とSeries.to_csv()は、ファイルハンドルが渡されたときにcompressionキーワードをサポートするようになりました。( GH 21227)Index.droplevel()は、MultiIndexとの互換性のために、フラットインデックスに対しても実装されるようになりました (GH 21115)Series.droplevel()とDataFrame.droplevel()が実装されました (GH 20342)gcsfsライブラリを介した Google Cloud Storage からの読み書きのサポートが追加されました ( GH 19454、 GH 23094)DataFrame.to_gbq()とread_gbq()の署名とドキュメントは、pandas-gbq ライブラリバージョン 0.8.0からの変更を反映して更新されました。credentials引数が追加され、あらゆる種類のgoogle-auth 資格情報を使用できるようになりました。( GH 21627、 GH 22557、 GH 23662)新しいメソッド
HDFStore.walk()は、HDF5 ファイルのグループ階層を再帰的に走査します ( GH 10932)read_html()は、colspanとrowspanを越えてセルデータをコピーし、headerkwargが与えられておらず、theadがない場合、すべてのthテーブル行をヘッダーとして扱います (GH 17054)Series.nlargest()、Series.nsmallest()、DataFrame.nlargest()、およびDataFrame.nsmallest()は、keep引数に値"all"を受け入れるようになりました。これにより、n番目に大きい/小さい値のすべてのタイが保持されます (GH 16818)IntervalIndexは、既存のclosed値を変更するためのset_closed()メソッドを取得しました (GH 21670)to_csv()、to_csv()、to_json()、およびto_json()は、ファイル名拡張子に基づいて圧縮を推論するcompression='infer'をサポートするようになりました (GH 15008)。to_csv、to_json、およびto_pickleメソッドのデフォルト圧縮が'infer'に更新されました (GH 22004)。DataFrame.to_sql()は、サポートされているデータベースに対してTIMESTAMP WITH TIME ZONE型を書き込むようになりました。タイムゾーンをサポートしないデータベースの場合、datetime データはタイムゾーン認識なしのローカルタイムスタンプとして保存されます。その意味合いについては、Datetime data typesを参照してください (GH 9086)。to_timedelta()は ISO 形式の timedelta 文字列をサポートするようになりました (GH 21877)SeriesおよびDataFrameは、コンストラクタでIterableオブジェクトをサポートするようになりました (GH 2193)DatetimeIndexはDatetimeIndex.timetz属性を取得しました。これは、タイムゾーン情報を含むローカル時間を返します。( GH 21358)round()、ceil()、およびfloor()forDatetimeIndexおよびTimestampは、曖昧な時間に丸められた datetime を処理するためのambiguous引数 (GH 18946) と、存在しない時間に丸められた datetime を処理するためのnonexistent引数をサポートするようになりました。詳細については、ローカライズ時の存在しない時間を参照してください (GH 22647)resample()の結果は、groupby()と同様に反復可能になりました (GH 15314)。Series.resample()とDataFrame.resample()は、Resampler.quantile()を取得しました (GH 15023)。DataFrame.resample()およびSeries.resample()とPeriodIndexは、DatetimeIndexの場合と同様にbase引数を尊重するようになりました。( GH 23882)pandas.api.types.is_list_like()にキーワードallow_setsが追加され、デフォルトでTrueになります。Falseの場合、setのすべてのインスタンスは「リストライク」と見なされなくなります (GH 23061)Index.to_frame()は列名を上書きできるようになりました (GH 22580)。Categorical.from_codes()は、categoriesとorderedを渡す代わりにdtypeパラメータを取ることができるようになりました (GH 24398)。新しい属性
__git_version__は、現在のビルドのgitコミットSHAを返します (GH 21295)。Matplotlib 3.0との互換性 (GH 22790)。
Intervalのようなオブジェクト間の重複を判断するための
Interval.overlaps()、arrays.IntervalArray.overlaps()、およびIntervalIndex.overlaps()が追加されました (GH 21998)read_fwf()はキーワードinfer_nrowsを受け入れるようになりました (GH 15138)。to_parquet()は、engine = 'pyarrow'の場合、DataFrameを列のサブセットでパーティション分割されたparquetファイルのディレクトリとして書き込むことをサポートするようになりました (GH 23283)Timestamp.tz_localize()、DatetimeIndex.tz_localize()、およびSeries.tz_localize()は、存在しない時間の代替処理のためのnonexistent引数を取得しました。詳細については、ローカライズ時の存在しない時間を参照してください (GH 8917、 GH 24466)Index.difference()、Index.intersection()、Index.union()、およびIndex.symmetric_difference()は、可能な場合に結果をソートするかどうかを制御するオプションのsortパラメータを持つようになりました (GH 17839、 GH 24471)read_excel()は、列名またはcallableのリストとしてusecolsを受け入れるようになりました (GH 18273)MultiIndex.to_flat_index()は、複数のレベルを単一レベルのIndexオブジェクトにフラット化するために追加されました。DataFrame.to_stata()とpandas.io.stata.StataWriter117は、混在する文字列列をStata strl形式で書き込むことができます (GH 23633)DataFrame.between_time()とDataFrame.at_time()はaxisパラメータを取得しました (GH 8839)DataFrame.to_records()はindex_dtypesとcolumn_dtypesパラメータを受け入れるようになり、格納される列とインデックスのレコードに異なるデータ型を許可します (GH 18146)IntervalIndexは、IntervalIndexに重複するインターバルが含まれているかどうかを示すis_overlapping属性を取得しました (GH 23309)pandas.DataFrame.to_sql()は、SQL挿入句を制御するためのmethod引数を取得しました。詳細については、ドキュメントの挿入メソッドセクションを参照してください。( GH 8953)DataFrame.corrwith()は、スピアマンの順位相関、ケンドールのタウ、および呼び出し可能な相関メソッドをサポートするようになりました。( GH 21925)DataFrame.to_json()、DataFrame.to_csv()、DataFrame.to_pickle()、およびその他のエクスポートメソッドは、パス引数でチルダ(~)をサポートするようになりました。( GH 23473)
下位互換性のない API の変更#
pandas 0.24.0 には、多くの API の破壊的変更が含まれています。
依存関係の最小バージョン引き上げ#
依存関係の最小サポートバージョンを更新しました ( GH 21242、 GH 18742、 GH 23774、 GH 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_csvのline_terminatorにos.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=strとna_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 17697、 GH 11736、 GH 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_timeとto_timestamp(how='end')の時間値#
PeriodおよびPeriodIndexオブジェクトの時間値は、Series.dt.end_time、Period.end_time、PeriodIndex.end_time、Period.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 21978、 GH 19056、 GH 22835)。このインターフェースに準拠し、pandas の他の部分との一貫性を保つために、いくつかの API の破壊的変更が行われました。
SparseArrayはnumpy.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.combineとDataFrame.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=True が get_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 オブジェクト (Day、Hour、Minute、Second、Milli、Micro、Nano) を作成することはサポートされなくなりました。これにより、追加が単調でなくなったり結合的でなくなったりする予期しない動作が防止されます (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属性を持つDatetimeIndexとTimedeltaIndexの場合、整数型の配列またはIndexの加算または減算は同じクラスのオブジェクトを返します (GH 19959)。DateOffsetオブジェクトは不変になりました。これらのいずれかを変更しようとすると、AttributeErrorが発生するようになりました (GH 21341)。PeriodIndexから別のPeriodIndexを減算すると、TypeErrorを発生させる代わりに、DateOffsetオブジェクトの object-dtypeIndexが返されるようになりました (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)。othersがsetの場合、Series.str.cat()はエラーを発生させるようになりました (GH 23009)。DatetimeIndexまたはTimedeltaIndexにスカラー値を渡すと、ValueErrorの代わりにTypeErrorが発生するようになりました (GH 23539)。HTMLFormatterのmax_rowsおよびmax_colsパラメーターは、切り捨てがDataFrameFormatterによって処理されるため削除されました (GH 23818)。read_csv()は、欠損値のある列が dtypeboolであると宣言された場合、ValueErrorを発生させるようになりました (GH 20591)。MultiIndex.to_frame()から得られるDataFrameの列順序は、MultiIndex.namesの順序と一致することが保証されるようになりました (GH 22420)。タプルのシーケンスではなく、誤って
DatetimeIndexをMultiIndex.from_tuples()に渡した場合、ValueErrorではなくTypeErrorが発生するようになりました (GH 24024)。pd.offsets.generate_range()の引数time_ruleは削除されました。代わりにoffsetを使用してください (GH 24157)。0.23.x では、pandas は数値列 (例:
intdtype の列) とobjectdtype の列のマージでValueErrorを発生させていました (GH 9780)。objectと他の dtype をマージする機能が再度有効になりました。ただし、pandas は、数値列と文字列のみで構成されるobjectdtype の列のマージでは引き続きエラーを発生させます (GH 21681)。重複する名前を持つ
MultiIndexのレベルにアクセスする (get_level_values()などで) と、KeyErrorではなくValueErrorが発生するようになりました (GH 21678)。サブ dtype が無効な場合、
IntervalDtypeの不正な構築は、ValueErrorではなく常にTypeErrorを発生させるようになりました (GH 21185)。ユニークでない
MultiIndexを持つDataFrameを再インデックスしようとすると、以前はExceptionが発生していましたが、現在はValueErrorが発生するようになりました (GH 21770)。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)。DatetimeIndexとTimedeltaIndexは、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)。オプトイン基底クラスメソッドのオーバーライドを介した
sum、meanなどの削減操作のサポート (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)。PeriodDtype、DatetimeTZDtype、およびIntervalDtypeの.type属性が、dtype のインスタンス (それぞれPeriod、Timestamp、およびInterval) に更新されました (GH 22938)。
演算子サポート
ExtensionArray に基づく Series は、算術演算子と比較演算子をサポートするようになりました (GH 19577)。ExtensionArray の演算子サポートを提供する方法は 2 つあります。
ExtensionArrayサブクラスに各演算子を定義します。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と整数インデックスを使用するSeriesのSeries.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に置き換えられました。機能は変更されていません。新しい名前は、これらのコードの性質をよりよく反映し、MultiIndexAPI をCategoricalIndexの API に近づけます (GH 13443)。その結果、MultiIndexでのlabelsの他の使用も非推奨となり、codesに置き換えられました。MultiIndexインスタンスは、labelsではなくcodesという名前のパラメータを使用して初期化する必要があります。MultiIndex.set_labelsはMultiIndex.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()は、リストライク**内**の任意のリストライクの使用を非推奨としました。リストライクコンテナは、多くのSeries、Index、または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(), andSeries.tz_localize()は、errors引数を非推奨とし、代わりにnonexistent引数を使用するようになりました (GH 8917)。クラス
FrozenNDArrayは非推奨になりました。このクラスが削除されると、アンピクル時にFrozenNDArrayはnp.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またはTimestampをTimestampとtz引数でタイムゾーン変換することは非推奨になりました。代わりに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)。start、end、periodsの範囲引数を渡してTimedeltaIndex、DatetimeIndex、またはPeriodIndexを作成することは非推奨となり、代わりにtimedelta_range()、date_range()、またはperiod_range()を使用するようになりました (GH 23919)。'datetime64[ns, UTC]'のような文字列エイリアスをDatetimeTZDtypeのunitパラメータとして渡すことは非推奨になりました。代わりに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.categorical、Series.cat.name、Series.cat.indexは非推奨になりました。代わりにSeries.catまたはSeriesの属性を直接使用してください (GH 24751)。np.dtype('datetime64')またはtimedelta64のように精度を持たない dtype をIndex、DatetimeIndexおよびTimedeltaIndexに渡すことは非推奨になりました。代わりにナノ秒精度の dtype を使用してください (GH 24753)。
日時と時間差との整数加算/減算は非推奨になりました#
以前は、ユーザーは場合によっては、整数または整数 dtype の配列を Timestamp、DatetimeIndex、および 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配列に変換すると、以下の方法で変換されました。
tz-awareデータをUTCに変換する
タイムゾーン情報を削除する
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.consolidateとSeries.consolidateは削除されました (GH 15501)以前非推奨だったモジュール
pandas.jsonの削除 (GH 19944)SparseArray.get_values()とSparseArray.to_dense()はfillパラメータを削除しました (GH 14686)DataFrame.sortlevelとSeries.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_dtypeはpandas.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)CategoricalとCategoricalIndexのメンバーシップチェックのパフォーマンスが向上しました (つまり、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)タイムゾーンが不明または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)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_valueがfill_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のDataFrameとTimedeltaライクなオブジェクトとの加算および減算のバグ (GH 22005, GH 22163)datetime64[ns]dtypeのDataFrameとDateOffsetオブジェクトとの加算および減算のバグで、datetime64[ns]dtypeではなくobjectdtypeを返していました (GH 21610, GH 22163)datetime64[ns]dtypeのDataFrameがNaTと誤って比較されるバグ (GH 22242, GH 22163)datetime64[ns]dtypeのDataFrameがTimestampライクなオブジェクトを減算する際に、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.valuesがDatetimeIndexを返していたバグ。現在では、Timestampオブジェクトの2Dnumpy.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データを持つ
Seriesreprのバグで、データとインデックスの間にスペースが欠落していました (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()のバグで、startとendがPeriodオブジェクトとして提供された場合にそれらの頻度が無視されていました (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のバグで、タイムゾーン対応のDatetimeIndexとdtype=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)DatetimeIndexとTimedeltaIndexのバグで、Ellipsisを使用してインデックスを作成すると、誤ってインデックスのfreq属性が失われていました (GH 21282)渡されたデータの最初の要素が
NaTのDatetimeIndexに誤ったfreq引数を渡した場合に生成されるエラーメッセージが明確化されました (GH 11587)to_datetime()のバグで、単位マッピングのDataFrameまたはdictを渡した場合にboxおよびutc引数が無視されていました (GH 23760)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のDataFrameがTimedeltaライクなスカラで除算される際に、float64dtypeではなくtimedelta64[ns]dtypeを誤って返していたバグ (GH 20088, GH 22163)オブジェクトdtypeの
Indexをtimedelta64[ns]dtypeのSeriesに追加すると誤ってエラーが発生していたバグを修正しました (GH 22390)数値dtypeの
Seriesがtimedelta64dtypeの配列またはSeriesを加算または減算する際のバグ (GH 22390)数値dtypeの
Indexがtimedelta64dtypeの配列を乗算または除算する際のバグ (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')を追加すると、すべてのNaTのTimedeltaIndexではなく、すべてのNaTのDatetimeIndexを誤って返していました (GH 23215)Timedeltaとto_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-awareDatetimeIndexと比較すると、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()がfirstとlastの結果を表示しなかったバグを修正しました (GH 21328)DatetimeIndexの比較のバグで、タイムゾーン対応のDatetimeIndexをnp.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)DataFrame.resample()とSeries.resample()のバグで、タイムゾーン対応時系列が夏時間移行で終わるとAmbiguousTimeErrorまたはNonExistentTimeErrorが発生していました (GH 19375, GH 10117)DataFrame.drop()とSeries.drop()のバグで、夏時間移行のあるDatetimeIndexから削除するキーとしてtz-aware Timestampを指定すると発生していました (GH 21761)DatetimeIndexコンストラクタのバグで、NaTとdateutil.tz.tzlocalでOutOfBoundsDatetimeエラーが発生していました (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()のバグで、unitとerrors='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で、キーワード引数weekとmillisecondsが受け入れられても無視されるバグがありました。これらの引数を渡すと、ValueErrorが発生するようになりました (GH 19398)。DateOffsetをDataFrameまたは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 の代わりにobjectdtype を返すバグがありました (GH 22047、GH 22163)。DataFrame.apply()で、文字列引数と追加の位置引数またはキーワード引数 (例:df.apply('sum', min_count=1)) が指定された場合に、誤ってTypeErrorが発生するバグがありました (GH 22376)。DataFrame.astype()を拡張 dtype に変換するとAttributeErrorが発生する可能性のあるバグがありました (GH 22578)。DataFrameでtimedelta64[ns]dtype と整数 dtype のndarrayを算術演算すると、ndarrayを誤ってtimedelta64[ns]dtype として扱うバグがありました (GH 23114)。Series.rpow()で、1の代わりに1 ** NAのオブジェクト dtypeNaNが発生するバグがありました (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()でサポートされる関数リストにlog10、floor、ceilが追加されました (GH 24139、GH 24353)。SeriesとIndex間の論理演算&, |, ^は、ValueErrorを発生させなくなりました (GH 22092)。is_scalar()関数で PEP 3141 の数値をチェックするとTrueが返されます (GH 22903)。Series.sum()のような削減メソッドは、NumPy ufunc から呼び出されたときにTypeErrorを発生させるのではなく、keepdims=Falseのデフォルト値を受け入れるようになりました。keepdimsの完全なサポートは実装されていません (GH 24356)。
変換#
文字列#
Interval#
IntervalIndexコンストラクタで、closedパラメータが推論されたclosedを常にオーバーライドしないバグがありました (GH 19370)。IntervalIndexrepr で、間隔のリストの後に末尾のカンマが欠落していたバグがありました (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)。IndexはNone、NaN、および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 9943、GH 9862)。ブール型
IndexでIndexをスライスするとTypeErrorが発生する可能性のあるバグがありました (GH 22533)。PeriodArray.__setitem__で、スライスとリストのような値を受け入れる際のバグがありました (GH 23978)。DatetimeIndex、TimedeltaIndexで、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)。MultiIndexにMultiIndex.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 15019、GH 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 16839、GH 13032)。DataFrame.to_string()で、DataFrameの表現がウィンドウ全体を占めないバグがありました (GH 22984)。DataFrame.to_csv()で、単一レベルの MultiIndex が誤ってタプルを書き込むバグがありました。現在では、インデックスの値のみが書き込まれます (GH 19589)。HDFStoreは、コンストラクタにformatkwarg が渡されたときにValueErrorを発生させるようになりました (GH 13291)。HDFStore.append()で、空の文字列列とmin_itemsize< 8 を持つDataFrameを追加する際のバグがありました (GH 12242)。read_csv()で、完了時またはエラー時のクリーンアップが不十分なために、C エンジンでNaN値を解析する際にメモリリークが発生するバグがありました (GH 21353)。read_csv()で、skipfooterがnrows、iterator、または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 18792、GH 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 21625、GH 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 10611、GH 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 未満の場合に
SeriesGroupByのSeriesGroupBy.count()メソッドを呼び出すと、ValueErrorが誤って発生するバグがありました (GH 21956)。Rolling.min()で、closed='left'と datetime-like インデックスを使用した場合に、誤った結果とセグメンテーション違反につながる複数のバグがありました (GH 21704)。Resampler.apply()で、適用された関数に位置引数を渡す際のバグがありました (GH 14615)。Series.resample()で、loffsetkwarg に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 9119、GH 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=TrueでGroupBy.rank()を呼び出すとZeroDivisionErrorが発生していました (GH 22519)。DataFrame.resample()で、TimeDeltaIndexのNaTをリサンプリングする際のバグがありました (GH 13223)。DataFrame.groupby()で、列を選択する際にobserved引数が尊重されず、常にobserved=Falseが使用されるバグがありました (GH 23970)。SeriesGroupBy.pct_change()またはDataFrameGroupBy.pct_change()は、以前はパーセンテージ変更を計算する際にグループ全体で機能していましたが、現在はグループごとに正しく機能するようになりました (GH 21200、GH 21235)。非常に大きな数 (2^32) の行でハッシュテーブルの作成を妨げるバグがありました (GH 22805)。
カテゴリカルでグループ化する際に、
observed=Trueでカテゴリカル列にnanが存在すると、ValueErrorが発生し、グループ化が誤るバグがありました (GH 24740、GH 21151)。
再整形#
pandas.concat()で、タイムゾーン対応インデックスを持つリサンプリングされた DataFrame を結合する際のバグがありました (GH 13783)。pandas.concat()で、Seriesのみを結合する際に、concatのnames引数が無視されなくなったバグがありました (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()において、OutOfBoundsdatetime64[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)重複する
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.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_valueのSeries.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値も適切に処理されます。
ビルドの変更#
開発のために pandas をビルドするには、
cython >= 0.28.2が必要になりました (GH 21688)pandas のテストには
hypothesis>=3.58が必要になりました。Hypothesis のドキュメントはこちら、pandas 固有の紹介はコントリビューションガイドで確認できます。 (GH 22280)macOS で pandas をビルドする場合、macOS 10.9 以降で実行すると、最小ターゲットが macOS 10.9 になりました (GH 23424)
その他#
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 +