バージョン 0.19.0 (2016年10月2日)#
これは 0.18.1 からのメジャーリリースであり、多数の API 変更、いくつかの新機能、機能強化、パフォーマンス改善に加え、多数のバグ修正が含まれています。すべてのユーザーがこのバージョンにアップグレードすることをお勧めします。
主な機能は以下の通りです。
アズオブ形式の時系列結合のための
merge_asof()はこちらを参照.rolling()が時系列対応になりました。こちらを参照read_csv()がCategoricalデータのパースをサポートしました。こちらを参照カテゴリカルデータを結合するための関数
union_categorical()が追加されました。こちらを参照PeriodIndexに独自のperioddtypes が追加され、他のIndexクラスとの一貫性が高まりました。こちらを参照疎なデータ構造が
intおよびbooldtypes のサポートを強化しました。こちらを参照Seriesとの比較演算でインデックスが無視されなくなりました。API 変更の概要はこちらを参照ユーティリティ関数の pandas 開発 API の導入。こちらを参照。
Panel4DおよびPanelNDの非推奨化。これらの種類のn次元データは、xarray パッケージで表現することをお勧めします。以前に非推奨化されたモジュール
pandas.io.data,pandas.io.wb,pandas.tools.rplotの削除。
警告
pandas >= 0.19.0 では、インポート時に numpy ufunc の警告が抑制されなくなります。こちらを参照。
v0.19.0 の新機能
新機能#
アズオブ形式の時系列結合のための関数 merge_asof#
長らく要望されていた機能が merge_asof() 関数によって追加され、アズオブ形式の時系列結合をサポートするようになりました (GH 1870, GH 13695, GH 13709, GH 13902)。完全なドキュメントはこちらです。
merge_asof() はアズオブマージを実行します。これは、キーが等しい場合ではなく、最も近いキーで一致させる点を除いて、左結合に似ています。
In [1]: left = pd.DataFrame({"a": [1, 5, 10], "left_val": ["a", "b", "c"]})
In [2]: right = pd.DataFrame({"a": [1, 2, 3, 6, 7], "right_val": [1, 2, 3, 6, 7]})
In [3]: left
Out[3]:
a left_val
0 1 a
1 5 b
2 10 c
[3 rows x 2 columns]
In [4]: right
Out[4]:
a right_val
0 1 1
1 2 2
2 3 3
3 6 6
4 7 7
[5 rows x 2 columns]
通常、可能な場合は正確に一致させ、それ以外の場合は最新の値を使用したいと考えます。
In [5]: pd.merge_asof(left, right, on="a")
Out[5]:
a left_val right_val
0 1 a 1
1 5 b 3
2 10 c 7
[3 rows x 3 columns]
以前のデータのみと一致させ、正確な一致は行わないこともできます。
In [6]: pd.merge_asof(left, right, on="a", allow_exact_matches=False)
Out[6]:
a left_val right_val
0 1 a NaN
1 5 b 3.0
2 10 c 7.0
[3 rows x 3 columns]
典型的な時系列の例では、trades と quotes があり、それらを asof-join したいと考えます。これは、マージする前にデータをグループ化するために by パラメーターを使用する例も示しています。
In [7]: trades = pd.DataFrame(
...: {
...: "time": pd.to_datetime(
...: [
...: "20160525 13:30:00.023",
...: "20160525 13:30:00.038",
...: "20160525 13:30:00.048",
...: "20160525 13:30:00.048",
...: "20160525 13:30:00.048",
...: ]
...: ),
...: "ticker": ["MSFT", "MSFT", "GOOG", "GOOG", "AAPL"],
...: "price": [51.95, 51.95, 720.77, 720.92, 98.00],
...: "quantity": [75, 155, 100, 100, 100],
...: },
...: columns=["time", "ticker", "price", "quantity"],
...: )
...:
In [8]: quotes = pd.DataFrame(
...: {
...: "time": pd.to_datetime(
...: [
...: "20160525 13:30:00.023",
...: "20160525 13:30:00.023",
...: "20160525 13:30:00.030",
...: "20160525 13:30:00.041",
...: "20160525 13:30:00.048",
...: "20160525 13:30:00.049",
...: "20160525 13:30:00.072",
...: "20160525 13:30:00.075",
...: ]
...: ),
...: "ticker": ["GOOG", "MSFT", "MSFT", "MSFT", "GOOG", "AAPL", "GOOG", "MSFT"],
...: "bid": [720.50, 51.95, 51.97, 51.99, 720.50, 97.99, 720.50, 52.01],
...: "ask": [720.93, 51.96, 51.98, 52.00, 720.93, 98.01, 720.88, 52.03],
...: },
...: columns=["time", "ticker", "bid", "ask"],
...: )
...:
In [9]: trades
Out[9]:
time ticker price quantity
0 2016-05-25 13:30:00.023 MSFT 51.95 75
1 2016-05-25 13:30:00.038 MSFT 51.95 155
2 2016-05-25 13:30:00.048 GOOG 720.77 100
3 2016-05-25 13:30:00.048 GOOG 720.92 100
4 2016-05-25 13:30:00.048 AAPL 98.00 100
[5 rows x 4 columns]
In [10]: quotes
Out[10]:
time ticker bid ask
0 2016-05-25 13:30:00.023 GOOG 720.50 720.93
1 2016-05-25 13:30:00.023 MSFT 51.95 51.96
2 2016-05-25 13:30:00.030 MSFT 51.97 51.98
3 2016-05-25 13:30:00.041 MSFT 51.99 52.00
4 2016-05-25 13:30:00.048 GOOG 720.50 720.93
5 2016-05-25 13:30:00.049 AAPL 97.99 98.01
6 2016-05-25 13:30:00.072 GOOG 720.50 720.88
7 2016-05-25 13:30:00.075 MSFT 52.01 52.03
[8 rows x 4 columns]
アズオブマージは、通常は日付時刻のような並べ替え可能なフィールドである on で結合し、この場合は by フィールドでグルーパーを使用します。これは左外部結合に似ていますが、最新の非 NaN 値を自動的に前方埋めします。
In [11]: pd.merge_asof(trades, quotes, on="time", by="ticker")
Out[11]:
time ticker price quantity bid ask
0 2016-05-25 13:30:00.023 MSFT 51.95 75 51.95 51.96
1 2016-05-25 13:30:00.038 MSFT 51.95 155 51.97 51.98
2 2016-05-25 13:30:00.048 GOOG 720.77 100 720.50 720.93
3 2016-05-25 13:30:00.048 GOOG 720.92 100 720.50 720.93
4 2016-05-25 13:30:00.048 AAPL 98.00 100 NaN NaN
[5 rows x 6 columns]
これは、元の左側のデータフレーム (trades) と同じ順序でエントリを持つマージされた DataFrame を返し、quotes のフィールドがマージされます。
メソッド .rolling() が時系列対応になりました#
.rolling() オブジェクトが時系列対応になり、window 引数に時系列オフセット (または変換可能なもの) を受け入れられるようになりました (GH 13327, GH 12995)。完全なドキュメントはこちらを参照してください。
In [12]: dft = pd.DataFrame(
....: {"B": [0, 1, 2, np.nan, 4]},
....: index=pd.date_range("20130101 09:00:00", periods=5, freq="s"),
....: )
....:
In [13]: dft
Out[13]:
B
2013-01-01 09:00:00 0.0
2013-01-01 09:00:01 1.0
2013-01-01 09:00:02 2.0
2013-01-01 09:00:03 NaN
2013-01-01 09:00:04 4.0
[5 rows x 1 columns]
これは通常の頻度インデックスです。整数ウィンドウパラメーターを使用すると、ウィンドウ頻度でロールできます。
In [14]: dft.rolling(2).sum()
Out[14]:
B
2013-01-01 09:00:00 NaN
2013-01-01 09:00:01 1.0
2013-01-01 09:00:02 3.0
2013-01-01 09:00:03 NaN
2013-01-01 09:00:04 NaN
[5 rows x 1 columns]
In [15]: dft.rolling(2, min_periods=1).sum()
Out[15]:
B
2013-01-01 09:00:00 0.0
2013-01-01 09:00:01 1.0
2013-01-01 09:00:02 3.0
2013-01-01 09:00:03 2.0
2013-01-01 09:00:04 4.0
[5 rows x 1 columns]
オフセットを指定すると、より直感的にローリング頻度を指定できます。
In [16]: dft.rolling("2s").sum()
Out[16]:
B
2013-01-01 09:00:00 0.0
2013-01-01 09:00:01 1.0
2013-01-01 09:00:02 3.0
2013-01-01 09:00:03 2.0
2013-01-01 09:00:04 4.0
[5 rows x 1 columns]
非規則的だが単調なインデックスを使用する場合、整数ウィンドウでのローリングは特別な計算を課しません。
In [17]: dft = pd.DataFrame(
....: {"B": [0, 1, 2, np.nan, 4]},
....: index=pd.Index(
....: [
....: pd.Timestamp("20130101 09:00:00"),
....: pd.Timestamp("20130101 09:00:02"),
....: pd.Timestamp("20130101 09:00:03"),
....: pd.Timestamp("20130101 09:00:05"),
....: pd.Timestamp("20130101 09:00:06"),
....: ],
....: name="foo",
....: ),
....: )
....:
In [18]: dft
Out[18]:
B
foo
2013-01-01 09:00:00 0.0
2013-01-01 09:00:02 1.0
2013-01-01 09:00:03 2.0
2013-01-01 09:00:05 NaN
2013-01-01 09:00:06 4.0
[5 rows x 1 columns]
In [19]: dft.rolling(2).sum()
Out[19]:
B
foo
2013-01-01 09:00:00 NaN
2013-01-01 09:00:02 1.0
2013-01-01 09:00:03 3.0
2013-01-01 09:00:05 NaN
2013-01-01 09:00:06 NaN
[5 rows x 1 columns]
時系列指定を使用すると、この疎なデータに対して可変ウィンドウが生成されます。
In [20]: dft.rolling("2s").sum()
Out[20]:
B
foo
2013-01-01 09:00:00 0.0
2013-01-01 09:00:02 1.0
2013-01-01 09:00:03 3.0
2013-01-01 09:00:05 NaN
2013-01-01 09:00:06 4.0
[5 rows x 1 columns]
さらに、DataFrame のインデックス (デフォルトではない) ではなく列を指定するために、オプションの on パラメーターを許可するようになりました。
In [21]: dft = dft.reset_index()
In [22]: dft
Out[22]:
foo B
0 2013-01-01 09:00:00 0.0
1 2013-01-01 09:00:02 1.0
2 2013-01-01 09:00:03 2.0
3 2013-01-01 09:00:05 NaN
4 2013-01-01 09:00:06 4.0
[5 rows x 2 columns]
In [23]: dft.rolling("2s", on="foo").sum()
Out[23]:
foo B
0 2013-01-01 09:00:00 0.0
1 2013-01-01 09:00:02 1.0
2 2013-01-01 09:00:03 3.0
3 2013-01-01 09:00:05 NaN
4 2013-01-01 09:00:06 4.0
[5 rows x 2 columns]
メソッド read_csv の重複列名に対するサポートが改善されました#
read_csv() で、ファイル内にあるか names パラメータとして渡されたかにかかわらず、重複する列名がサポートされるようになりました (GH 7160, GH 9424)
In [24]: data = "0,1,2\n3,4,5"
In [25]: names = ["a", "b", "a"]
以前の動作:
In [2]: pd.read_csv(StringIO(data), names=names)
Out[2]:
a b a
0 2 1 2
1 5 4 5
最初の a 列は2番目の a 列と同じデータを含んでいましたが、本来は値 [0, 3] を含んでいるべきでした。
新しい動作:
In [26]: pd.read_csv(StringIO(data), names=names)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[26], line 1
----> 1 pd.read_csv(StringIO(data), names=names)
File ~/work/pandas/pandas/pandas/io/parsers/readers.py:1026, in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)
1013 kwds_defaults = _refine_defaults_read(
1014 dialect,
1015 delimiter,
(...)
1022 dtype_backend=dtype_backend,
1023 )
1024 kwds.update(kwds_defaults)
-> 1026 return _read(filepath_or_buffer, kwds)
File ~/work/pandas/pandas/pandas/io/parsers/readers.py:617, in _read(filepath_or_buffer, kwds)
614 nrows = kwds.get("nrows", None)
616 # Check for duplicates in names.
--> 617 _validate_names(kwds.get("names", None))
619 # Create the parser.
620 parser = TextFileReader(filepath_or_buffer, **kwds)
File ~/work/pandas/pandas/pandas/io/parsers/readers.py:576, in _validate_names(names)
574 if names is not None:
575 if len(names) != len(set(names)):
--> 576 raise ValueError("Duplicate names are not allowed.")
577 if not (
578 is_list_like(names, allow_sets=False) or isinstance(names, abc.KeysView)
579 ):
580 raise ValueError("Names should be an ordered collection.")
ValueError: Duplicate names are not allowed.
メソッド read_csv が Categorical の直接パースをサポートしました#
read_csv() 関数が、dtype として指定された場合に Categorical 列のパースをサポートするようになりました (GH 10153)。データの構造によっては、パース後に Categorical に変換する場合と比較して、パース時間の短縮とメモリ使用量の削減につながる可能性があります。I/O ドキュメントはこちらを参照してください。
In [27]: data = """
....: col1,col2,col3
....: a,b,1
....: a,b,2
....: c,d,3
....: """
....:
In [28]: pd.read_csv(StringIO(data))
Out[28]:
col1 col2 col3
0 a b 1
1 a b 2
2 c d 3
[3 rows x 3 columns]
In [29]: pd.read_csv(StringIO(data)).dtypes
Out[29]:
col1 object
col2 object
col3 int64
Length: 3, dtype: object
In [30]: pd.read_csv(StringIO(data), dtype="category").dtypes
Out[30]:
col1 category
col2 category
col3 category
Length: 3, dtype: object
個々の列は dict 指定を使用して Categorical としてパースできます
In [31]: pd.read_csv(StringIO(data), dtype={"col1": "category"}).dtypes
Out[31]:
col1 category
col2 object
col3 int64
Length: 3, dtype: object
注
結果のカテゴリは常に文字列 (オブジェクト dtype) としてパースされます。カテゴリが数値の場合、to_numeric() 関数、または必要に応じて to_datetime() などの別のコンバーターを使用して変換できます。
In [32]: df = pd.read_csv(StringIO(data), dtype="category")
In [33]: df.dtypes
Out[33]:
col1 category
col2 category
col3 category
Length: 3, dtype: object
In [34]: df["col3"]
Out[34]:
0 1
1 2
2 3
Name: col3, Length: 3, dtype: category
Categories (3, object): ['1', '2', '3']
In [35]: new_categories = pd.to_numeric(df["col3"].cat.categories)
In [36]: df["col3"] = df["col3"].cat.rename_categories(new_categories)
In [37]: df["col3"]
Out[37]:
0 1
1 2
2 3
Name: col3, Length: 3, dtype: category
Categories (3, int64): [1, 2, 3]
カテゴリカル結合#
カテゴリカルデータを結合するための関数
union_categoricals()が追加されました。カテゴリカルのユニオンを参照してください (GH 13361, GH 13763, GH 13846, GH 14173)In [38]: from pandas.api.types import union_categoricals In [39]: a = pd.Categorical(["b", "c"]) In [40]: b = pd.Categorical(["a", "b"]) In [41]: union_categoricals([a, b]) Out[41]: ['b', 'c', 'a', 'b'] Categories (3, object): ['b', 'c', 'a']
concatおよびappendが、異なるcategoriesを持つcategorydtypes をobjectdtype として連結できるようになりました (GH 13524)In [42]: s1 = pd.Series(["a", "b"], dtype="category") In [43]: s2 = pd.Series(["b", "c"], dtype="category")
以前の動作:
In [1]: pd.concat([s1, s2])
ValueError: incompatible categories in categorical concat
新しい動作:
In [44]: pd.concat([s1, s2])
Out[44]:
0 a
1 b
0 b
1 c
Length: 4, dtype: object
半月オフセット#
pandas に新しい頻度オフセット、SemiMonthEnd (‘SM’) と SemiMonthBegin (‘SMS’) が追加されました。これらは、それぞれ (デフォルトで) 月の15日と月末、および月の15日と1日に固定された日付オフセットを提供します。 (GH 1543)
In [45]: from pandas.tseries.offsets import SemiMonthEnd, SemiMonthBegin
SemiMonthEnd:
In [46]: pd.Timestamp("2016-01-01") + SemiMonthEnd()
Out[46]: Timestamp('2016-01-15 00:00:00')
In [47]: pd.date_range("2015-01-01", freq="SM", periods=4)
Out[47]: DatetimeIndex(['2015-01-15', '2015-01-31', '2015-02-15', '2015-02-28'], dtype='datetime64[ns]', freq='SM-15')
SemiMonthBegin:
In [46]: pd.Timestamp("2016-01-01") + SemiMonthBegin()
Out[46]: Timestamp('2016-01-15 00:00:00')
In [47]: pd.date_range("2015-01-01", freq="SMS", periods=4)
Out[47]: DatetimeIndex(['2015-01-01', '2015-01-15', '2015-02-01', '2015-02-15'], dtype='datetime64[ns]', freq='SMS-15')
固定接尾辞を使用すると、15日の代わりに使用する月の日も指定できます。
In [50]: pd.date_range("2015-01-01", freq="SMS-16", periods=4)
Out[50]: DatetimeIndex(['2015-01-01', '2015-01-16', '2015-02-01', '2015-02-16'], dtype='datetime64[ns]', freq='SMS-16')
In [51]: pd.date_range("2015-01-01", freq="SM-14", periods=4)
Out[51]: DatetimeIndex(['2015-01-14', '2015-01-31', '2015-02-14', '2015-02-28'], dtype='datetime64[ns]', freq='SM-14')
新しいインデックスメソッド#
Series および DataFrame API との一貫性を高めるため、以下のメソッドとオプションが Index に追加されました。
Index が、同じ形状のインデックス付けのための .where() 関数をサポートするようになりました (GH 13170)
In [48]: idx = pd.Index(["a", "b", "c"])
In [49]: idx.where([True, False, True])
Out[49]: Index(['a', None, 'c'], dtype='object')
Index が、欠損値を除外するための .dropna() をサポートするようになりました (GH 6194)
In [50]: idx = pd.Index([1, 2, np.nan, 4])
In [51]: idx.dropna()
Out[51]: Index([1.0, 2.0, 4.0], dtype='float64')
MultiIndex の場合、デフォルトではいずれかのレベルが欠損している場合に値が削除されます。how='all' を指定すると、すべてのレベルが欠損している値のみが削除されます。
In [52]: midx = pd.MultiIndex.from_arrays([[1, 2, np.nan, 4], [1, 2, np.nan, np.nan]])
In [53]: midx
Out[53]:
MultiIndex([(1.0, 1.0),
(2.0, 2.0),
(nan, nan),
(4.0, nan)],
)
In [54]: midx.dropna()
Out[54]:
MultiIndex([(1, 1),
(2, 2)],
)
In [55]: midx.dropna(how="all")
Out[55]:
MultiIndex([(1, 1.0),
(2, 2.0),
(4, nan)],
)
Index が、DataFrame を返す .str.extractall() をサポートするようになりました。詳細はこちらのドキュメントを参照してください (GH 10008, GH 13156)
In [56]: idx = pd.Index(["a1a2", "b1", "c1"])
In [57]: idx.str.extractall(r"[ab](?P<digit>\d)")
Out[57]:
digit
match
0 0 1
1 2
1 0 1
[3 rows x 1 columns]
Index.astype() がオプションのブール引数 copy を受け入れるようになりました。これにより、dtype の要件が満たされている場合にオプションのコピーが可能になります (GH 13209)
Google BigQuery の機能強化#
read_gbq()メソッドにdialect引数が追加され、ユーザーが BigQuery のレガシー SQL または標準 SQL のどちらを使用するかを指定できるようになりました。詳細については、ドキュメントを参照してください (GH 13615)。to_gbq()メソッドが、DataFrame の列順序が宛先テーブルスキーマと異なることを許可するようになりました (GH 11359)。
きめ細かい NumPy errstate#
以前のバージョンの pandas では、pandas をインポートすると NumPy の ufunc エラー処理が永久に抑制されていました。これは、通常 NaN として表現される欠損データで NumPy ufunc を使用した際に発生する警告を抑制するためでした。残念ながら、これにより、pandas 以外のアプリケーションコードで発生する正当な警告も抑制されていました。0.19.0 からは、pandas は numpy.errstate コンテキストマネージャーを使用して、これらの警告をよりきめ細かく抑制し、pandas のコードベースでこれらの操作が実際に使用されている箇所でのみ警告を抑制します。 (GH 13109, GH 13145)
pandas をアップグレードした後、コードから 新しい RuntimeWarnings が発行される場合があります。これらは正当なものであり、根本原因は以前のバージョンの pandas を使用していたときにも存在していた可能性がありますが、単に警告が抑制されていただけです。RuntimeWarning の発生源の周囲で numpy.errstate を使用して、これらの条件の処理方法を制御してください。
メソッド get_dummies が整数 dtype を返すようになりました#
pd.get_dummies 関数が、ダミーエンコードされた列を浮動小数点数ではなく、より小さい整数として返すようになりました (GH 8725)。これにより、メモリフットプリントが改善されるはずです。
以前の動作:
In [1]: pd.get_dummies(['a', 'b', 'a', 'c']).dtypes
Out[1]:
a float64
b float64
c float64
dtype: object
新しい動作:
In [58]: pd.get_dummies(["a", "b", "a", "c"]).dtypes
Out[58]:
a bool
b bool
c bool
Length: 3, dtype: object
to_numeric で値を可能な最小の dtype にダウンキャスト#
pd.to_numeric() が downcast パラメーターを受け入れるようになりました。これにより、可能であればデータを指定された最小の数値 dtype にダウンキャストします (GH 13352)
In [59]: s = ["1", 2, 3]
In [60]: pd.to_numeric(s, downcast="unsigned")
Out[60]: array([1, 2, 3], dtype=uint8)
In [61]: pd.to_numeric(s, downcast="integer")
Out[61]: array([1, 2, 3], dtype=int8)
pandas 開発 API#
将来的に pandas API をより統一的でアクセスしやすくするため、pandas の標準的なサブパッケージ pandas.api を作成し、公開 API を保持するようにしました。pandas.api.types で型イントロスペクション関数を公開することから始めています。将来のバージョンの pandas では、さらに多くのサブパッケージと公式に承認された API が公開される予定です (GH 13147, GH 13634)
以下は現在この API の一部です
In [62]: import pprint
In [63]: from pandas.api import types
In [64]: funcs = [f for f in dir(types) if not f.startswith("_")]
In [65]: pprint.pprint(funcs)
['CategoricalDtype',
'DatetimeTZDtype',
'IntervalDtype',
'PeriodDtype',
'infer_dtype',
'is_any_real_numeric_dtype',
'is_array_like',
'is_bool',
'is_bool_dtype',
'is_categorical_dtype',
'is_complex',
'is_complex_dtype',
'is_datetime64_any_dtype',
'is_datetime64_dtype',
'is_datetime64_ns_dtype',
'is_datetime64tz_dtype',
'is_dict_like',
'is_dtype_equal',
'is_extension_array_dtype',
'is_file_like',
'is_float',
'is_float_dtype',
'is_hashable',
'is_int64_dtype',
'is_integer',
'is_integer_dtype',
'is_interval',
'is_interval_dtype',
'is_iterator',
'is_list_like',
'is_named_tuple',
'is_number',
'is_numeric_dtype',
'is_object_dtype',
'is_period_dtype',
'is_re',
'is_re_compilable',
'is_scalar',
'is_signed_integer_dtype',
'is_sparse',
'is_string_dtype',
'is_timedelta64_dtype',
'is_timedelta64_ns_dtype',
'is_unsigned_integer_dtype',
'pandas_dtype',
'union_categoricals']
注
内部モジュール pandas.core.common からこれらの関数を呼び出すと、DeprecationWarning が表示されるようになりました (GH 13990)
その他の機能強化#
Timestampがdatetime.datetime()と同様に位置引数とキーワード引数を受け入れるようになりました (GH 10758, GH 11630)In [66]: pd.Timestamp(2012, 1, 1) Out[66]: Timestamp('2012-01-01 00:00:00') In [67]: pd.Timestamp(year=2012, month=1, day=1, hour=8, minute=30) Out[67]: Timestamp('2012-01-01 08:30:00')
.resample()関数が、日付時刻のような列またはMultiIndexレベルでリサンプリングするためにon=またはlevel=パラメータを受け入れるようになりました (GH 13500)In [68]: df = pd.DataFrame( ....: {"date": pd.date_range("2015-01-01", freq="W", periods=5), "a": np.arange(5)}, ....: index=pd.MultiIndex.from_arrays( ....: [[1, 2, 3, 4, 5], pd.date_range("2015-01-01", freq="W", periods=5)], ....: names=["v", "d"], ....: ), ....: ) ....: In [69]: df Out[69]: date a v d 1 2015-01-04 2015-01-04 0 2 2015-01-11 2015-01-11 1 3 2015-01-18 2015-01-18 2 4 2015-01-25 2015-01-25 3 5 2015-02-01 2015-02-01 4 [5 rows x 2 columns]
In [74]: df.resample("M", on="date")[["a"]].sum() Out[74]: a date 2015-01-31 6 2015-02-28 4 [2 rows x 1 columns] In [75]: df.resample("M", level="d")[["a"]].sum() Out[75]: a d 2015-01-31 6 2015-02-28 4 [2 rows x 1 columns]
GbqConnectorの.get_credentials()メソッドが、まずアプリケーションのデフォルト認証情報の取得を試行できるようになりました。詳細については、ドキュメントを参照してください (GH 13577)。DatetimeIndexおよびTimestampの.tz_localize()メソッドにerrorsキーワードが追加され、存在しないタイムスタンプをNaTに強制できるようになりました。デフォルトの動作はNonExistentTimeErrorを発生させることのままです (GH 13057).to_hdf/read_hdf()がファイルパスとしてパスオブジェクト (例:pathlib.Path,py.path.local) を受け入れるようになりました (GH 11773)pd.read_csv()とengine='python'が、decimal(GH 12933)、na_filter(GH 13321)、およびmemory_mapオプション (GH 13381) のサポートを獲得しました。Python API との一貫性により、
pd.read_csv()は+infを正の無限大と解釈するようになりました (GH 13274)pd.read_html()が、na_values,converters,keep_default_naオプションをサポートするようになりました (GH 13461)Categorical.astype()がオプションのブール引数copyを受け入れるようになりました (dtype がカテゴリカルの場合に有効) (GH 13209)DataFrameに.asof()メソッドが追加され、選択されたサブセットに基づいて最後の非 NaN 値を返すようになりました (GH 13358)DataFrameコンストラクターが、OrderedDictオブジェクトのリストが渡された場合にキー順序を尊重するようになりました (GH 13304)pd.read_html()がdecimalオプションをサポートするようになりました (GH 12907)Seriesに、Indexと同様に.is_monotonic,.is_monotonic_increasing,.is_monotonic_decreasingプロパティが追加されました (GH 13336)DataFrame.to_sql()が、すべての列に SQL 型として単一の値を受け入れるようになりました (GH 11886)。Series.appendがignore_indexオプションをサポートするようになりました (GH 13677).to_stata()およびStataWriterが、列名をラベルに変換する辞書を使用して、変数ラベルを Stata dta ファイルに書き込めるようになりました (GH 13535, GH 13536).to_stata()およびStataWriterが、ValueErrorを発生させる代わりに、datetime64[ns]列を自動的に Stata 形式%tcに変換するようになりました (GH 12259)read_stata()およびStataReaderが、convert_categoricals=Trueの場合に、繰り返し値ラベルを持つ Stata ファイルを読み込む際に、より明確なエラーメッセージでエラーを発生させるようになりました (GH 13923)DataFrame.styleがスパース化された MultiIndexes をレンダリングするようになりました (GH 11655)DataFrame.styleが列レベル名 (例:DataFrame.columns.names) を表示するようになりました (GH 13775)DataFrameが、df.sort_values(by='...', axis=1)を使用して行の値に基づいて列を並べ替えるサポートを獲得しました (GH 10806)In [70]: df = pd.DataFrame({"A": [2, 7], "B": [3, 5], "C": [4, 8]}, index=["row1", "row2"]) In [71]: df Out[71]: A B C row1 2 3 4 row2 7 5 8 [2 rows x 3 columns] In [72]: df.sort_values(by="row2", axis=1) Out[72]: B A C row1 3 2 4 row2 5 7 8 [2 rows x 3 columns]
I/O に、混合 dtype を持つ列の読み込みの危険性とそれへの対処法に関するドキュメントが追加されました (GH 13746)
to_html()にborder引数が追加され、開始<table>タグの値が制御できるようになりました。デフォルトはhtml.borderオプションの値で、デフォルトは 1 です。これはノートブックの HTML 表現にも影響しますが、Jupyter の CSS には border-width 属性が含まれているため、視覚的な効果は同じです。 (GH 11563)。sqlalchemyがインストールされておらず、接続文字列が使用されている場合に、SQL 関数でImportErrorを発生させるようになりました (GH 11920)。matplotlib 2.0 との互換性。以前のバージョンの pandas も matplotlib 2.0 で動作するはずです (GH 13333)
Timestamp,Period,DatetimeIndex,PeriodIndexおよび.dtアクセサに、日付が閏年に属するかどうかをチェックする.is_leap_yearプロパティが追加されました。 (GH 13727)astype()が、dtype引数として列名からデータ型へのマッピングの辞書を受け入れるようになりました。 (GH 12086)pd.read_jsonとDataFrame.to_jsonが、linesオプションで JSON ラインの読み書きをサポートするようになりました。行区切り JSONを参照してください (GH 9180)read_excel()が true_values および false_values キーワード引数をサポートするようになりました (GH 13347)groupby()が、非MultiIndexのグルーパーに対してlevelを指定するために、スカラ値と単一要素リストを受け入れるようになりました。 (GH 13907)Excel の日付列内の変換できない日付は、例外を発生させるのではなく、変換されずに返され、列は
objectdtype になります (GH 10001)。pd.Timedelta(None)が受け入れられるようになり、pd.Timestampを模倣してNaTを返すようになりました (GH 13687)pd.read_stata()が、SAS が Stata dta ファイルを生成する際に作成する一部のフォーマット 111 ファイルを処理できるようになりました (GH 11526)SeriesとIndexがdivmodをサポートするようになり、Series または Index のタプルを返します。これは、ブロードキャスティングルールに関して標準の二項演算子のように動作します (GH 14208)。
APIの変更点#
Series.tolist() が Python 型を返すようになりました#
Series.tolist() が、NumPy の .tolist() の動作を模倣して、出力で Python 型を返すようになりました (GH 10904)
In [73]: s = pd.Series([1, 2, 3])
以前の動作:
In [7]: type(s.tolist()[0])
Out[7]:
<class 'numpy.int64'>
新しい動作:
In [74]: type(s.tolist()[0])
Out[74]: int
異なるインデックスを持つ Series 演算子#
DataFrame を含め、すべての演算子の一貫性を保つために、以下の Series 演算子が変更されました (GH 1134, GH 4581, GH 13538)
Seriesの比較演算子が、indexが異なる場合にValueErrorを発生させるようになりました。Seriesの論理演算子は、左右両側のindexを揃えます。
警告
0.18.1 までは、同じ長さの Series を比較すると、.index が異なっていても成功していました (結果は .index を無視)。0.19.0 からは、より厳密にするために ValueError を発生させます。このセクションでは、以前の動作を維持したり、.eq のような柔軟な比較メソッドを使用して異なるインデックスを揃えたりする方法についても説明します。
その結果、Series および DataFrame の演算子は以下のようになります
算術演算子#
算術演算子は両方の index を揃えます (変更なし)。
In [75]: s1 = pd.Series([1, 2, 3], index=list("ABC"))
In [76]: s2 = pd.Series([2, 2, 2], index=list("ABD"))
In [77]: s1 + s2
Out[77]:
A 3.0
B 4.0
C NaN
D NaN
Length: 4, dtype: float64
In [78]: df1 = pd.DataFrame([1, 2, 3], index=list("ABC"))
In [79]: df2 = pd.DataFrame([2, 2, 2], index=list("ABD"))
In [80]: df1 + df2
Out[80]:
0
A 3.0
B 4.0
C NaN
D NaN
[4 rows x 1 columns]
比較演算子#
比較演算子は、.index が異なる場合に ValueError を発生させます。
以前の動作 (Series)
Series は、両方が同じ長さである限り .index を無視して値を比較していました
In [1]: s1 == s2
Out[1]:
A False
B True
C False
dtype: bool
新しい動作 (Series)
In [2]: s1 == s2
Out[2]:
ValueError: Can only compare identically-labeled Series objects
注
以前のバージョンと同じ結果を得るには (位置に基づいて値を比較し、.index を無視)、両方の .values を比較します。
In [81]: s1.values == s2.values
Out[81]: array([False, True, False])
Series を .index を揃えて比較したい場合は、下記の柔軟な比較メソッドのセクションを参照してください
In [82]: s1.eq(s2)
Out[82]:
A False
B True
C False
D False
Length: 4, dtype: bool
現在の動作 (DataFrame, 変更なし)
In [3]: df1 == df2
Out[3]:
ValueError: Can only compare identically-labeled DataFrame objects
論理演算子#
論理演算子は左右両側の .index を揃えます。
以前の動作 (Series)、左側の index のみが保持されていました
In [4]: s1 = pd.Series([True, False, True], index=list('ABC'))
In [5]: s2 = pd.Series([True, True, True], index=list('ABD'))
In [6]: s1 & s2
Out[6]:
A True
B False
C False
dtype: bool
新しい動作 (Series)
In [83]: s1 = pd.Series([True, False, True], index=list("ABC"))
In [84]: s2 = pd.Series([True, True, True], index=list("ABD"))
In [85]: s1 & s2
Out[85]:
A True
B False
C False
D False
Length: 4, dtype: bool
注
Series 論理演算子は、NaN の結果を False で埋めます。
注
以前のバージョンと同じ結果 (左側のインデックスのみに基づいて値を比較) を得るには、reindex_like を使用できます
In [86]: s1 & s2.reindex_like(s1)
Out[86]:
A True
B False
C False
Length: 3, dtype: bool
現在の動作 (DataFrame, 変更なし)
In [87]: df1 = pd.DataFrame([True, False, True], index=list("ABC"))
In [88]: df2 = pd.DataFrame([True, True, True], index=list("ABD"))
In [89]: df1 & df2
Out[89]:
0
A True
B False
C False
D False
[4 rows x 1 columns]
柔軟な比較メソッド#
Series の柔軟な比較メソッド (例: eq, ne, le, lt, ge, gt) が、両方の index を揃えるようになりました。異なる index を持つ2つの Series を比較したい場合は、これらの演算子を使用してください。
In [90]: s1 = pd.Series([1, 2, 3], index=["a", "b", "c"])
In [91]: s2 = pd.Series([2, 2, 2], index=["b", "c", "d"])
In [92]: s1.eq(s2)
Out[92]:
a False
b True
c False
d False
Length: 4, dtype: bool
In [93]: s1.ge(s2)
Out[93]:
a False
b True
c True
d False
Length: 4, dtype: bool
以前は、これは比較演算子と同じように動作していました (上記を参照)。
代入時の Series 型昇格#
Series が、現在の dtype と互換性のない値で代入された場合に、その dtype を正しく昇格させるようになりました (GH 13234)
In [94]: s = pd.Series()
以前の動作:
In [2]: s["a"] = pd.Timestamp("2016-01-01")
In [3]: s["b"] = 3.0
TypeError: invalid type promotion
新しい動作:
In [95]: s["a"] = pd.Timestamp("2016-01-01")
In [96]: s["b"] = 3.0
In [97]: s
Out[97]:
a 2016-01-01 00:00:00
b 3.0
Length: 2, dtype: object
In [98]: s.dtype
Out[98]: dtype('O')
関数 .to_datetime() の変更点#
以前、.to_datetime() が混合整数/浮動小数点数と文字列に遭遇し、かつ日付時刻がなく errors='coerce' であった場合、すべてを NaT に変換していました。
以前の動作:
In [2]: pd.to_datetime([1, 'foo'], errors='coerce')
Out[2]: DatetimeIndex(['NaT', 'NaT'], dtype='datetime64[ns]', freq=None)
現在の動作:
これは、デフォルトの単位 ns で整数/浮動小数点数を変換するようになりました。
In [99]: pd.to_datetime([1, "foo"], errors="coerce")
Out[99]: DatetimeIndex(['1970-01-01 00:00:00.000000001', 'NaT'], dtype='datetime64[ns]', freq=None)
.to_datetime() に関連するバグ修正
整数または浮動小数点数を渡し、
unitがなくerrors='coerce'の場合のpd.to_datetime()のバグ (GH 13180)。無効なデータ型 (例: bool) を渡した場合の
pd.to_datetime()のバグ。今後はerrorsキーワードを尊重します (GH 13176)int8およびint16dtypes でオーバーフローしたpd.to_datetime()のバグ (GH 13451)pd.to_datetime()のバグで、NaNと他の文字列が無効な場合にerrors='ignore'のときにAttributeErrorが発生する (GH 12424)pd.to_datetime()のバグで、unitが指定されたときに浮動小数点数を正しくキャストせず、切り捨てられた日付時刻になった (GH 13834)
マージの変更点#
マージが結合キーの dtype を保持するようになりました (GH 8596)
In [100]: df1 = pd.DataFrame({"key": [1], "v1": [10]})
In [101]: df1
Out[101]:
key v1
0 1 10
[1 rows x 2 columns]
In [102]: df2 = pd.DataFrame({"key": [1, 2], "v1": [20, 30]})
In [103]: df2
Out[103]:
key v1
0 1 20
1 2 30
[2 rows x 2 columns]
以前の動作:
In [5]: pd.merge(df1, df2, how='outer')
Out[5]:
key v1
0 1.0 10.0
1 1.0 20.0
2 2.0 30.0
In [6]: pd.merge(df1, df2, how='outer').dtypes
Out[6]:
key float64
v1 float64
dtype: object
新しい動作:
結合キーを保持できます
In [104]: pd.merge(df1, df2, how="outer")
Out[104]:
key v1
0 1 10
1 1 20
2 2 30
[3 rows x 2 columns]
In [105]: pd.merge(df1, df2, how="outer").dtypes
Out[105]:
key int64
v1 int64
Length: 2, dtype: object
もちろん、欠損値が導入された場合は、結果の dtype はアップキャストされ、以前と変更はありません。
In [106]: pd.merge(df1, df2, how="outer", on="key")
Out[106]:
key v1_x v1_y
0 1 10.0 20
1 2 NaN 30
[2 rows x 3 columns]
In [107]: pd.merge(df1, df2, how="outer", on="key").dtypes
Out[107]:
key int64
v1_x float64
v1_y int64
Length: 3, dtype: object
メソッド .describe() の変更点#
.describe() 出力のインデックスにあるパーセンタイル識別子が、重複しないように最小限の精度に丸められるようになりました (GH 13104)
In [108]: s = pd.Series([0, 1, 2, 3, 4])
In [109]: df = pd.DataFrame([0, 1, 2, 3, 4])
以前の動作:
パーセンタイルは小数点以下1桁までに丸められていましたが、パーセンタイルが重複するとデータフレームで ValueError が発生する可能性がありました。
In [3]: s.describe(percentiles=[0.0001, 0.0005, 0.001, 0.999, 0.9995, 0.9999])
Out[3]:
count 5.000000
mean 2.000000
std 1.581139
min 0.000000
0.0% 0.000400
0.1% 0.002000
0.1% 0.004000
50% 2.000000
99.9% 3.996000
100.0% 3.998000
100.0% 3.999600
max 4.000000
dtype: float64
In [4]: df.describe(percentiles=[0.0001, 0.0005, 0.001, 0.999, 0.9995, 0.9999])
Out[4]:
...
ValueError: cannot reindex from a duplicate axis
新しい動作:
In [110]: s.describe(percentiles=[0.0001, 0.0005, 0.001, 0.999, 0.9995, 0.9999])
Out[110]:
count 5.000000
mean 2.000000
std 1.581139
min 0.000000
0.01% 0.000400
0.05% 0.002000
0.1% 0.004000
50% 2.000000
99.9% 3.996000
99.95% 3.998000
99.99% 3.999600
max 4.000000
Length: 12, dtype: float64
In [111]: df.describe(percentiles=[0.0001, 0.0005, 0.001, 0.999, 0.9995, 0.9999])
Out[111]:
0
count 5.000000
mean 2.000000
std 1.581139
min 0.000000
0.01% 0.000400
0.05% 0.002000
0.1% 0.004000
50% 2.000000
99.9% 3.996000
99.95% 3.998000
99.99% 3.999600
max 4.000000
[12 rows x 1 columns]
さらに
重複する
percentilesを渡すと、ValueErrorが発生するようになりました。混合 dtype 列インデックスを持つ DataFrame での
.describe()のバグで、以前はTypeErrorが発生していました (GH 13288)
Period の変更点#
PeriodIndex が period dtype を持つようになりました#
PeriodIndex が独自の period dtype を持つようになりました。period dtype は、category や タイムゾーン認識 dtype (datetime64[ns, tz]) と同様の pandas 拡張 dtype です (GH 13941)。この変更の結果、PeriodIndex は整数 dtype を持たなくなりました。
以前の動作:
In [1]: pi = pd.PeriodIndex(['2016-08-01'], freq='D')
In [2]: pi
Out[2]: PeriodIndex(['2016-08-01'], dtype='int64', freq='D')
In [3]: pd.api.types.is_integer_dtype(pi)
Out[3]: True
In [4]: pi.dtype
Out[4]: dtype('int64')
新しい動作:
In [112]: pi = pd.PeriodIndex(["2016-08-01"], freq="D")
In [113]: pi
Out[113]: PeriodIndex(['2016-08-01'], dtype='period[D]')
In [114]: pd.api.types.is_integer_dtype(pi)
Out[114]: False
In [115]: pd.api.types.is_period_dtype(pi)
Out[115]: True
In [116]: pi.dtype
Out[116]: period[D]
In [117]: type(pi.dtype)
Out[117]: pandas.core.dtypes.dtypes.PeriodDtype
Period('NaT') が pd.NaT を返すようになりました#
以前、Period は pd.NaT とは異なる独自の Period('NaT') 表現を持っていました。現在、Period('NaT') は pd.NaT を返すように変更されました。 (GH 12759, GH 13582)
以前の動作:
In [5]: pd.Period('NaT', freq='D')
Out[5]: Period('NaT', 'D')
新しい動作:
これらは freq オプションを指定しなくても pd.NaT を返します。
In [118]: pd.Period("NaT")
Out[118]: NaT
In [119]: pd.Period(None)
Out[119]: NaT
Period の加算および減算と互換性を持たせるため、pd.NaT が int との加算および減算をサポートするようになりました。以前は ValueError を発生させていました。
以前の動作:
In [5]: pd.NaT + 1
...
ValueError: Cannot add integral value to Timestamp without freq.
新しい動作:
In [120]: pd.NaT + 1
Out[120]: NaT
In [121]: pd.NaT - 1
Out[121]: NaT
PeriodIndex.values が Period オブジェクトの配列を返すようになりました#
.values が、整数の配列ではなく Period オブジェクトの配列を返すように変更されました (GH 13988)。
以前の動作:
In [6]: pi = pd.PeriodIndex(['2011-01', '2011-02'], freq='M')
In [7]: pi.values
Out[7]: array([492, 493])
新しい動作:
In [122]: pi = pd.PeriodIndex(["2011-01", "2011-02"], freq="M")
In [123]: pi.values
Out[123]: array([Period('2011-01', 'M'), Period('2011-02', 'M')], dtype=object)
インデックス + / - は集合演算に使用されなくなりました#
基本 Index 型および DatetimeIndex (数値インデックス型ではない) の加算と減算は、以前は集合演算 (集合和と差) を実行していました。この動作は 0.15.0 からすでに非推奨化されており (特定の .union() および .difference() メソッドの使用を推奨)、現在では無効になっています。可能な場合、+ および - は要素ごとの操作に使用されるようになりました。例えば、文字列の連結や日付時刻の減算などです (GH 8227, GH 14127)。
以前の動作
In [1]: pd.Index(['a', 'b']) + pd.Index(['a', 'c'])
FutureWarning: using '+' to provide set union with Indexes is deprecated, use '|' or .union()
Out[1]: Index(['a', 'b', 'c'], dtype='object')
新しい動作: 同じ操作が要素ごとの加算を実行するようになりました
In [124]: pd.Index(["a", "b"]) + pd.Index(["a", "c"])
Out[124]: Index(['aa', 'bc'], dtype='object')
数値 Index オブジェクトはすでに要素ごとの操作を実行していました。例えば、2つの整数 Index を加算する動作は変更されていません。基本 Index もこの動作と一貫性を持つようになりました。
In [125]: pd.Index([1, 2, 3]) + pd.Index([2, 3, 4])
Out[125]: Index([3, 5, 7], dtype='int64')
さらに、この変更により、2つの DatetimeIndex オブジェクトを減算して TimedeltaIndex を得ることが可能になりました
以前の動作:
In [1]: (pd.DatetimeIndex(['2016-01-01', '2016-01-02'])
...: - pd.DatetimeIndex(['2016-01-02', '2016-01-03']))
FutureWarning: using '-' to provide set differences with datetimelike Indexes is deprecated, use .difference()
Out[1]: DatetimeIndex(['2016-01-01'], dtype='datetime64[ns]', freq=None)
新しい動作:
In [126]: (
.....: pd.DatetimeIndex(["2016-01-01", "2016-01-02"])
.....: - pd.DatetimeIndex(["2016-01-02", "2016-01-03"])
.....: )
.....:
Out[126]: TimedeltaIndex(['-1 days', '-1 days'], dtype='timedelta64[ns]', freq=None)
Index.difference および .symmetric_difference の変更点#
Index.difference および Index.symmetric_difference が、より一貫して NaN 値を他の値と同様に扱うようになりました。 (GH 13514)
In [127]: idx1 = pd.Index([1, 2, 3, np.nan])
In [128]: idx2 = pd.Index([0, 1, np.nan])
以前の動作:
In [3]: idx1.difference(idx2)
Out[3]: Float64Index([nan, 2.0, 3.0], dtype='float64')
In [4]: idx1.symmetric_difference(idx2)
Out[4]: Float64Index([0.0, nan, 2.0, 3.0], dtype='float64')
新しい動作:
In [129]: idx1.difference(idx2)
Out[129]: Index([2.0, 3.0], dtype='float64')
In [130]: idx1.symmetric_difference(idx2)
Out[130]: Index([0.0, 2.0, 3.0], dtype='float64')
Index.unique が一貫して Index を返すようになりました#
Index.unique() が、一意の値を適切な dtype の Index として返すようになりました (GH 13395)。以前は、ほとんどの Index クラスは np.ndarray を返し、DatetimeIndex, TimedeltaIndex, PeriodIndex はタイムゾーンなどのメタデータを保持するために Index を返していました。
以前の動作:
In [1]: pd.Index([1, 2, 3]).unique()
Out[1]: array([1, 2, 3])
In [2]: pd.DatetimeIndex(['2011-01-01', '2011-01-02',
...: '2011-01-03'], tz='Asia/Tokyo').unique()
Out[2]:
DatetimeIndex(['2011-01-01 00:00:00+09:00', '2011-01-02 00:00:00+09:00',
'2011-01-03 00:00:00+09:00'],
dtype='datetime64[ns, Asia/Tokyo]', freq=None)
新しい動作:
In [131]: pd.Index([1, 2, 3]).unique()
Out[131]: Index([1, 2, 3], dtype='int64')
In [132]: pd.DatetimeIndex(
.....: ["2011-01-01", "2011-01-02", "2011-01-03"], tz="Asia/Tokyo"
.....: ).unique()
.....:
Out[132]:
DatetimeIndex(['2011-01-01 00:00:00+09:00', '2011-01-02 00:00:00+09:00',
'2011-01-03 00:00:00+09:00'],
dtype='datetime64[ns, Asia/Tokyo]', freq=None)
MultiIndex コンストラクター、groupby および set_index がカテゴリカル dtypes を保持するようになりました#
MultiIndex.from_arrays および MultiIndex.from_product が、MultiIndex レベルでカテゴリカル dtype を保持するようになりました (GH 13743, GH 13854)。
In [133]: cat = pd.Categorical(["a", "b"], categories=list("bac"))
In [134]: lvl1 = ["foo", "bar"]
In [135]: midx = pd.MultiIndex.from_arrays([cat, lvl1])
In [136]: midx
Out[136]:
MultiIndex([('a', 'foo'),
('b', 'bar')],
)
以前の動作:
In [4]: midx.levels[0]
Out[4]: Index(['b', 'a', 'c'], dtype='object')
In [5]: midx.get_level_values[0]
Out[5]: Index(['a', 'b'], dtype='object')
新しい動作: 単一レベルが CategoricalIndex になりました
In [137]: midx.levels[0]
Out[137]: CategoricalIndex(['b', 'a', 'c'], categories=['b', 'a', 'c'], ordered=False, dtype='category')
In [138]: midx.get_level_values(0)
Out[138]: CategoricalIndex(['a', 'b'], categories=['b', 'a', 'c'], ordered=False, dtype='category')
MultiIndex.from_product でも同様の変更が加えられました。その結果、groupby および set_index もインデックス内のカテゴリカル dtype を保持します。
In [139]: df = pd.DataFrame({"A": [0, 1], "B": [10, 11], "C": cat})
In [140]: df_grouped = df.groupby(by=["A", "C"], observed=False).first()
In [141]: df_set_idx = df.set_index(["A", "C"])
以前の動作:
In [11]: df_grouped.index.levels[1]
Out[11]: Index(['b', 'a', 'c'], dtype='object', name='C')
In [12]: df_grouped.reset_index().dtypes
Out[12]:
A int64
C object
B float64
dtype: object
In [13]: df_set_idx.index.levels[1]
Out[13]: Index(['b', 'a', 'c'], dtype='object', name='C')
In [14]: df_set_idx.reset_index().dtypes
Out[14]:
A int64
C object
B int64
dtype: object
新しい動作:
In [142]: df_grouped.index.levels[1]
Out[142]: CategoricalIndex(['b', 'a', 'c'], categories=['b', 'a', 'c'], ordered=False, dtype='category', name='C')
In [143]: df_grouped.reset_index().dtypes
Out[143]:
A int64
C category
B float64
Length: 3, dtype: object
In [144]: df_set_idx.index.levels[1]
Out[144]: CategoricalIndex(['b', 'a', 'c'], categories=['b', 'a', 'c'], ordered=False, dtype='category', name='C')
In [145]: df_set_idx.reset_index().dtypes
Out[145]:
A int64
C category
B int64
Length: 3, dtype: object
関数 read_csv はチャンクを漸進的に列挙するようになりました#
read_csv() が chunksize=n でインデックスを指定せずに呼び出された場合、以前は各チャンクが 0 から n-1 まで独立して生成されたインデックスを持っていました。現在は、最初のチャンクには 0 から始まり、2番目のチャンクには n から始まる漸進的なインデックスが与えられます。これにより、連結したときに chunksize= 引数なしで read_csv() を呼び出した結果と同一になります (GH 12185)。
In [146]: data = "A,B\n0,1\n2,3\n4,5\n6,7"
以前の動作:
In [2]: pd.concat(pd.read_csv(StringIO(data), chunksize=2))
Out[2]:
A B
0 0 1
1 2 3
0 4 5
1 6 7
新しい動作:
In [147]: pd.concat(pd.read_csv(StringIO(data), chunksize=2))
Out[147]:
A B
0 0 1
1 2 3
2 4 5
3 6 7
[4 rows x 2 columns]
スパースに関する変更点#
これらの変更により、pandas はより多くの dtype を持つ疎なデータを処理できるようになり、データ処理をよりスムーズにするための作業が行われました。
型 int64 および bool のサポート強化#
疎なデータ構造が、int64 および bool dtype のサポートを強化しました (GH 667, GH 13849)。
以前は、すべての入力が int または bool dtype であっても、疎なデータはデフォルトで float64 dtype でした。int64 dtype の疎なデータを作成するには、明示的に dtype を指定する必要がありました。また、fill_value も明示的に指定する必要がありました。これは、デフォルトが np.nan であり、int64 または bool データには存在しないためです。
In [1]: pd.SparseArray([1, 2, 0, 0])
Out[1]:
[1.0, 2.0, 0.0, 0.0]
Fill: nan
IntIndex
Indices: array([0, 1, 2, 3], dtype=int32)
# specifying int64 dtype, but all values are stored in sp_values because
# fill_value default is np.nan
In [2]: pd.SparseArray([1, 2, 0, 0], dtype=np.int64)
Out[2]:
[1, 2, 0, 0]
Fill: nan
IntIndex
Indices: array([0, 1, 2, 3], dtype=int32)
In [3]: pd.SparseArray([1, 2, 0, 0], dtype=np.int64, fill_value=0)
Out[3]:
[1, 2, 0, 0]
Fill: 0
IntIndex
Indices: array([0, 1], dtype=int32)
v0.19.0 から、疎なデータは入力 dtype を保持し、より適切な fill_value のデフォルト値を使用します (int64 dtype の場合は 0、bool dtype の場合は False)。
In [148]: pd.arrays.SparseArray([1, 2, 0, 0], dtype=np.int64)
Out[148]:
[1, 2, 0, 0]
Fill: 0
IntIndex
Indices: array([0, 1], dtype=int32)
In [149]: pd.arrays.SparseArray([True, False, False, False])
Out[149]:
[True, False, False, False]
Fill: False
IntIndex
Indices: array([0], dtype=int32)
詳細については、ドキュメントを参照してください。
演算子が dtype を保持するようになりました#
疎なデータ構造が、算術演算後に
dtypeを保持できるようになりました (GH 13848)
s = pd.SparseSeries([0, 2, 0, 1], fill_value=0, dtype=np.int64)
s.dtype
s + 1
疎なデータ構造が、内部の
dtypeを変換するためのastypeをサポートするようになりました (GH 13900)
s = pd.SparseSeries([1.0, 0.0, 2.0, 0.0], fill_value=0)
s
s.astype(np.int64)
データが指定された dtype に変換できない値を含んでいる場合、astype は失敗します。この制限は、デフォルトが np.nan である fill_value に適用されることに注意してください。
In [7]: pd.SparseSeries([1., np.nan, 2., np.nan], fill_value=np.nan).astype(np.int64)
Out[7]:
ValueError: unable to coerce current fill_value nan to int64 dtype
その他の疎なデータに関する修正#
サブクラス化された
SparseDataFrameおよびSparseSeriesが、スライシングまたは転置時にクラス型を保持するようになりました。 (GH 13787)booldtype を持つSparseArrayが論理 (bool) 演算子をサポートするようになりました (GH 14000)MultiIndexを持つSparseSeriesの[]インデックス付けでIndexErrorが発生する可能性のあるバグ (GH 13144)MultiIndexを持つSparseSeriesの[]インデックス付けの結果が通常のIndexを持つ可能性のあるバグ (GH 13144)SparseDataFrameでaxis=Noneがaxis=0にデフォルト設定されなかったバグ (GH 13048)objectdtype を持つSparseSeriesおよびSparseDataFrameの作成でTypeErrorが発生する可能性のあるバグ (GH 11633)SparseDataFrameが渡されたSparseArrayまたはSparseSeriesの dtype とfill_valueを尊重しないバグ (GH 13866)SparseArrayおよびSparseSeriesがfill_valueに ufunc を適用しないバグ (GH 13853)SparseSeries.absが負のfill_valueを誤って保持するバグ (GH 13853)複数型
SparseDataFrameの単一行スライシングで、以前は型が強制的に浮動小数点数に変換されていたバグ (GH 13917)SparseSeriesのスライシングで整数 dtype が浮動小数点数に変わるバグ (GH 8292)SparseDataFarmeの比較演算でTypeErrorが発生する可能性のあるバグ (GH 13001)SparseDataFarme.isnullがValueErrorを発生させるバグ (GH 8276)booldtype を持つSparseSeriesの表現でIndexErrorが発生する可能性のあるバグ (GH 13110)boolまたはint64dtype のSparseSeriesおよびSparseDataFrameがfloat64dtype のように値を表示する可能性のあるバグ (GH 13110)booldtype を持つSparseArrayを使用したスパースインデックス付けで誤った結果が返される可能性のあるバグ (GH 13985)SparseSeriesから作成されたSparseArrayがdtypeを失う可能性のあるバグ (GH 13999)疎なデータと密なデータとの
SparseSeriesの比較で、SparseSeriesではなく通常のSeriesが返されるバグ (GH 13999)
インデクサー dtype の変更#
注
この変更は、Windows で動作する 64 ビット Python にのみ影響し、比較的高度なインデックス操作にのみ影響します
Index.get_indexer のようにインデクサー配列を返すメソッドは、その配列を「プラットフォーム int」に強制変換し、numpy.take のようなサードパーティライブラリ操作で直接使用できるようにします。以前は、プラットフォーム int は C 整数に対応する np.int_ として定義されていましたが、正しい型 (現在使用されているもの) は、ポインタを保持できる C 整数サイズに対応する np.intp です (GH 3033, GH 13972)。
これらの型は多くのプラットフォームで同じですが、Windows の 64 ビット Python の場合、np.int_ は 32 ビットで、np.intp は 64 ビットです。この動作を変更することで、そのプラットフォームでの多くの操作のパフォーマンスが向上します。
以前の動作:
In [1]: i = pd.Index(['a', 'b', 'c'])
In [2]: i.get_indexer(['b', 'b', 'c']).dtype
Out[2]: dtype('int32')
新しい動作:
In [1]: i = pd.Index(['a', 'b', 'c'])
In [2]: i.get_indexer(['b', 'b', 'c']).dtype
Out[2]: dtype('int64')
その他の API の変更#
Timestamp.to_pydatetimeは、warn=Trueで、かつインスタンスにゼロ以外のナノ秒が含まれている場合にUserWarningを発行するようになりました。以前は標準出力にメッセージが出力されていました (GH 14101)。datetime とタイムゾーンを持つ
Series.unique()が、タイムゾーンを持つTimestampの配列を返すようになりました (GH 13565)。Panel.to_sparse()が呼び出されたときにNotImplementedError例外を発生させるようになりました (GH 13778)。Index.reshape()が呼び出されたときにNotImplementedError例外を発生させるようになりました (GH 12882)。.filter()がキーワード引数の相互排他性を強制するようになりました (GH 12399)。evalのfloat32型のアップキャスティングルールが、NumPy のルールとより一貫するように更新されました。新しい動作では、pandas のfloat32オブジェクトをスカラ float64 で乗算してもfloat64にアップキャストされません (GH 12388)。np.meanのような NumPy ufunc が groupby または resample オブジェクトで呼び出された場合、UnsupportedFunctionCallエラーが発生するようになりました (GH 12811)。__setitem__が、呼び出し可能な rhs を関数として適用するのではなく、そのまま格納するようになりました。以前の動作を得るには、whereを直接呼び出してください (GH 13299)。.sample()の呼び出しがnumpy.random.seed(n)で設定された乱数シードを尊重するようになりました (GH 13161)Styler.applyは、関数が返す出力に関してより厳密になりました。axis=0またはaxis=1の場合、出力の形状は同一である必要があります。axis=Noneの場合、出力は同一の列とインデックスラベルを持つDataFrameである必要があります (GH 13222)。Float64Index.astype(int)は、Float64IndexにNaN値が含まれている場合、ValueErrorを発生させるようになりました (GH 13149)TimedeltaIndex.astype(int)およびDatetimeIndex.astype(int)は、np.arrayの代わりにInt64Indexを返すようになりました (GH 13209)複数の頻度を持つ
Periodを通常のIndexに渡すと、objectdtype のIndexが返されるようになりました (GH 13664)PeriodIndex.fillnaに異なる頻度を持つPeriodを渡すと、objectdtype に型変換されるようになりました (GH 13664)DataFrame.boxplot(by=col)からのファセットボックスプロットは、return_typeがNoneでない場合、Seriesを返すようになりました。以前はOrderedDictを返していました。なお、デフォルトであるreturn_type=Noneの場合、これらは引き続き2次元NumPy配列を返します (GH 12216, GH 7096)。pd.read_hdfは、r,r+,a以外のモードが指定された場合、KeyErrorの代わりにValueErrorを発生させるようになりました。 (GH 13623)pd.read_csv(),pd.read_table(), およびpd.read_hdf()は、存在しないファイルに対して呼び出された場合、Python 3.xでは組み込みのFileNotFoundError例外を発生させます。これはPython 2.xではIOErrorとしてバックポートされます (GH 14086)より情報量の多い例外がCSVパーサーを介して渡されるようになりました。例外タイプは、
CParserErrorの代わりに元の例外タイプになります (GH 13652)。Cエンジンにおける
pd.read_csv()は、sepでエンコードされた文字が1文字より長い場合、ParserWarningを発行するか、ValueErrorを発生させるようになりました (GH 14065)DataFrame.valuesは、int64とuint64の混在するdtypesを持つDataFrameでfloat64を返すようになり、np.find_common_typeに準拠するようになりました (GH 10364, GH 13917).groupby.groupsは、np.ndarrayまたはlistの辞書ではなく、Indexオブジェクトの辞書を返すようになりました (GH 14293)
非推奨#
Series.reshapeとCategorical.reshapeは非推奨となり、今後のリリースで削除されます (GH 12882, GH 12882)PeriodIndex.to_datetimeはPeriodIndex.to_timestampの代わりに非推奨となりました (GH 8254)Timestamp.to_datetimeはTimestamp.to_pydatetimeの代わりに非推奨となりました (GH 8254)Index.to_datetimeおよびDatetimeIndex.to_datetimeはpd.to_datetimeの代わりに非推奨となりました (GH 8254)pandas.core.datetoolsモジュールは非推奨となり、今後のリリースで削除されます (GH 14094)SparseListは非推奨となり、将来のバージョンで削除されます (GH 13784)DataFrame.to_html()およびDataFrame.to_latex()は、colSpaceパラメータをcol_spaceのために削除しました (GH 13857)DataFrame.to_sql()は、SQLAlchemyがインストールされていない場合に不要であるため、flavorパラメータを非推奨としました (GH 13611)read_csvキーワードが非推奨になりましたトップレベルの
pd.ordered_merge()はpd.merge_ordered()に名称変更され、元の名称は将来のバージョンで削除されます (GH 13358)Timestamp.offsetプロパティ (およびコンストラクタの命名引数) はfreqのために非推奨となりました (GH 12160)pd.tseries.util.pivot_annualは非推奨です。代わりにpivot_tableを使用してください。例はこちらです (GH 736)pd.tseries.util.isleapyearは非推奨となり、今後のリリースで削除されます。Datetime-likeオブジェクトは.is_leap_yearプロパティを持つようになりました (GH 13727)Panel4DおよびPanelNDコンストラクタは非推奨となり、将来のバージョンで削除されます。これらのタイプのn次元データを表現する推奨される方法は、xarrayパッケージを使用することです。pandasは、この変換を自動化するためのto_xarray()メソッドを提供します (GH 13564)。pandas.tseries.frequencies.get_standard_freqは非推奨です。代わりにpandas.tseries.frequencies.to_offset(freq).rule_codeを使用してください (GH 13874)pandas.tseries.frequencies.to_offsetのfreqstrキーワードはfreqのために非推奨となりました (GH 13874)Categorical.from_arrayは非推奨となり、将来のバージョンで削除されます (GH 13854)
以前のバージョンの非推奨/変更の削除#
SparsePanelクラスは削除されました (GH 13778)pd.sandboxモジュールは、外部ライブラリpandas-qtのために削除されました (GH 13670)pandas.io.dataおよびpandas.io.wbモジュールは、pandas-datareaderパッケージのために削除されました (GH 13724)。pandas.tools.rplotモジュールは、seabornパッケージのために削除されました (GH 13855)DataFrame.to_csv()は、0.17.1で非推奨となったengineパラメータを削除しました (GH 11274, GH 13419)DataFrame.to_dict()は、outtypeパラメータをorientのために削除しました (GH 13627, GH 8486)pd.Categoricalは、ordered属性の直接設定を廃止し、set_orderedメソッドを推奨するようになりました (GH 13671)pd.Categoricalは、levels属性を廃止し、categoriesを推奨するようになりました (GH 8376)DataFrame.to_sql()は、flavorパラメータのmysqlオプションを削除しました (GH 13611)Panel.shift()は、lagsパラメータをperiodsのために削除しました (GH 14041)pd.Indexは、diffメソッドをdifferenceのために削除しました (GH 13669)pd.DataFrameは、to_wideメソッドをto_panelのために削除しました (GH 14039)Series.to_csvは、nanRepパラメータをna_repのために削除しました (GH 13804)Series.xs,DataFrame.xs,Panel.xs,Panel.major_xs, およびPanel.minor_xsはcopyパラメータを削除しました (GH 13781)str.splitはreturn_typeパラメータをexpandのために削除しました (GH 13701)レガシータイムルール (オフセットエイリアス) の削除。0.17.0以降非推奨 (0.8.0以降エイリアス) (GH 13590, GH 13868)。現在、レガシータイムルールは
ValueErrorを発生させます。現在サポートされているオフセットのリストについては、こちらを参照してください。DataFrame.plot.boxおよびDataFrame.boxplotのreturn_typeパラメータのデフォルト値がNoneから"axes"に変更されました。これらのメソッドは、デフォルトでアーティストの辞書ではなくmatplotlib軸を返すようになりました。こちらを参照してください (GH 6581)。pandas.io.sqlモジュール内のtqueryおよびuquery関数は削除されました (GH 5950)。
パフォーマンス改善#
疎な
IntIndex.intersectのパフォーマンスが向上しました (GH 13082)ブロック数が多い場合の
BlockIndexを使用した疎な算術演算のパフォーマンスが向上しましたが、このような場合はIntIndexの使用が推奨されます (GH 13082)DataFrame.quantile()のパフォーマンスが向上しました。これは、ブロックごとに動作するようになったためです (GH 11623)float64ハッシュテーブル操作のパフォーマンスが向上し、Python 3での非常に遅いインデックス作成およびgroupby操作が修正されました (GH 13166, GH 13334)
DataFrameGroupBy.transformのパフォーマンスが向上しました (GH 12737)IndexおよびSeriesの.duplicatedのパフォーマンスが向上しました (GH 10235)Index.differenceのパフォーマンスが向上しました (GH 12044)RangeIndex.is_monotonic_increasingおよびis_monotonic_decreasingのパフォーマンスが向上しました (GH 13749)DatetimeIndexにおける日時文字列解析のパフォーマンスが向上しました (GH 13692)Periodのハッシュ化のパフォーマンスが向上しました (GH 12817)タイムゾーン付きの日時データの
factorizeのパフォーマンスが向上しました (GH 13750)より大きなインデックスでインデックスハッシュテーブルを遅延作成することにより、パフォーマンスが向上しました (GH 14266)
groupby.groupsのパフォーマンスが向上しました (GH 14293)メモリ使用量を内省する際にMultiIndexを不必要に具体化していました (GH 14308)
バグ修正#
欠損値を持つ列でグループ化する際、まれにセグメンテーション違反や破損を引き起こす可能性のある
groupby().shift()のバグを修正しました (GH 13813)axis=1の場合にcumprodを計算するgroupby().cumsum()のバグを修正しました。 (GH 13994)pd.to_timedelta()でerrorsパラメータが尊重されていなかったバグを修正しました (GH 13613)io.json.json_normalize()で、非ASCIIキーが例外を発生させていたバグを修正しました (GH 13213)デフォルトでインデックス付けされていない
Seriesを.plot()のxerrまたはyerrとして渡す際のバグを修正しました (GH 11858)サブプロットが有効な場合、または凡例がプロット後に移動された場合に、エリアプロットが凡例を誤って描画するバグを修正しました (エリアプロットの凡例を正しく描画するにはmatplotlib 1.5.0が必要です) (GH 9161, GH 13544)
object-dtyped
Indexを持つDataFrameの代入で、結果の列が元のオブジェクトに対して変更可能であったバグを修正しました。 (GH 13522)matplotlib
AutoDataFormatterのバグを修正しました。これにより、第2スケールのフォーマットが復元され、マイクロ秒スケールのフォーマットが再追加されます (GH 13131)固定形式の
HDFStoreからstartおよび/またはstopが指定された選択を行う際のバグを修正し、選択された範囲が返されるようになりました (GH 8287)Categorical.from_codes()で無効なorderedパラメータが渡された場合に、役立たないエラーが発生していたバグを修正しました (GH 14058)Windowsで整数タプルから
Seriesを構築する際にデフォルトのdtype (int64) が返されなかったバグを修正しました (GH 13646)Datetime-likeオブジェクトとの
TimedeltaIndex加算でオーバーフローが捕捉されていなかったバグを修正しました (GH 14068)同じオブジェクトが複数回呼び出されたときの
.groupby(..).resample(..)のバグを修正しました (GH 13174)インデックス名がユニコード文字列の場合の
.to_records()のバグを修正しました (GH 13172)実装されていないオブジェクトに対して
.memory_usage()を呼び出す際のバグを修正しました (GH 12924)NaNを含む
Series.quantileの回帰を修正しました (これは.median()および.describe()でも発生していました)。さらに、Seriesには分位点を含む名前が付けられるようになりました (GH 13098, GH 13146)日時値と欠損グループを持つ
SeriesGroupBy.transformのバグを修正しました (GH 13191)空の
Seriesが日時のような数値演算で誤って型変換されていたバグを修正しました (GH 13844)タイムゾーン付き日時を含む
Categoricalが渡された場合のCategoricalコンストラクタのバグを修正しました (GH 14190)strインデックスを持つSeries.str.extractall()がValueErrorを発生させていたバグを修正しました (GH 13156)単一グループと量指定子を持つ
Series.str.extractall()のバグを修正しました (GH 13382)DatetimeIndexとPeriodの減算がTypeErrorではなくValueErrorまたはAttributeErrorを発生させていたバグを修正しました (GH 13078)NaNとNaTが混在するデータで作成されたIndexおよびSeriesがdatetime64dtype を持たない場合があったバグを修正しました (GH 13324)IndexおよびSeriesがnp.datetime64('nat')およびnp.timdelta64('nat')を無視してdtypeを推測する場合があったバグを修正しました (GH 13324)PeriodIndexとPeriodの減算がAttributeErrorを発生させていたバグを修正しました (GH 13071)特定の状況で
PeriodIndexの構築がfloat64インデックスを返していたバグを修正しました (GH 13067)空の場合に
PeriodIndexを持つ.resample(..)が適切にfreqを変更していなかったバグを修正しました (GH 13067)空の場合に
PeriodIndexを持つ.resample(..)が空のDataFrameで適切にそのタイプまたは名前を保持していなかったバグを修正しました (GH 13212)渡された関数がグループごとにスカラ値を返す場合の
groupby(..).apply(..)のバグを修正しました (GH 13468)。いくつかのキーワードを渡すと例外が発生する
groupby(..).resample(..)のバグを修正しました (GH 13235)正しい結果を得るためにインデックスがソートされていることに依存していたtz-aware
DateTimeIndexの.tz_convertのバグを修正しました (GH 13306)dateutil.tz.tzlocalを使用した.tz_localizeが誤った結果を返す場合があるバグを修正しました (GH 13583)DatetimeTZDtypedtype がdateutil.tz.tzlocalで有効なdtypeと見なされなかったバグを修正しました (GH 13583)pd.read_hdf()で、単一のデータセットを持つHDFファイルを読み込もうとした際に、1つ以上のカテゴリ列があり、キー引数がデータセット名に設定されていないと失敗するバグを修正しました (GH 13231).rolling()で、Rolling()オブジェクトの構築時に負の整数ウィンドウが許可され、その後の集計で失敗していたバグを修正しました (GH 13383)数値インデックスとタプル値データを持つ
Seriesのインデックス作成のバグを修正しました (GH 13509)pd.DataFrameの印刷で、objectdtype を持つ珍しい要素がセグメンテーション違反を引き起こしていたバグを修正しました (GH 13717)Seriesのランク付けでセグメンテーション違反が発生する可能性があったバグを修正しました (GH 13445)渡されたインデックスの名前が伝播されなかった、様々なインデックスタイプのバグを修正しました (GH 12309)
DatetimeIndexでcopy=Trueが尊重されていなかったバグを修正しました (GH 13205)DatetimeIndex.is_normalizedがローカルタイムゾーンの場合に正規化された日付範囲に対して誤った値を返していたバグを修正しました (GH 13459)pd.concatおよび.appendがdatetime64およびtimedeltaを、TimestampまたはTimedeltaではなく、Python組み込みのdatetimeまたはtimedeltaを含むobjectdtype に型変換する可能性があるバグを修正しました (GH 13626)結果が
objectdtype の場合にPeriodIndex.appendがAttributeErrorを発生させる場合があったバグを修正しました (GH 13221)CategoricalIndex.appendが通常のlistを受け入れる場合があったバグを修正しました (GH 13626)同じタイムゾーンを持つ
pd.concatと.appendがUTCにリセットされるバグを修正しました (GH 7795)データにDST境界付近の日時が含まれる場合、
SeriesおよびDataFrameの.appendがAmbiguousTimeErrorを発生させるバグを修正しました (GH 13626)DataFrame.to_csv()で、数値以外の値にのみ引用符が指定されているにもかかわらず、浮動小数点値が引用符で囲まれて出力されていたバグを修正しました (GH 12922, GH 13259)ブール値の列のみを含む
DataFrame.describe()がValueErrorを発生させていたバグを修正しました (GH 13898)MultiIndexスライスで、レベルが非ユニークな場合に余分な要素が返されていたバグを修正しました (GH 12896).str.replaceが無効な置換に対してTypeErrorを発生させなかったバグを修正しました (GH 13438)MultiIndex.from_arraysで入力配列の長さが一致するかどうかをチェックしていなかったバグを修正しました (GH 13599)cartesian_productおよびMultiIndex.from_productで空の入力配列で発生する可能性があったバグを修正しました (GH 12258)pd.read_csv()で、まれな状況でストリーム/ファイルを大きなチャンクで反復処理する際に、セグメンテーション違反または破損を引き起こす可能性があったバグを修正しました (GH 13703)pd.read_csv()で、スカラを含む辞書がna_valuesとして渡された場合にエラーが発生していたバグを修正しました (GH 12224)pd.read_csv()で、BOMファイルを無視せずに誤って解析していたバグを修正しました (GH 4793)engine='python'を使用したpd.read_csv()で、numpy配列がusecolsとして渡された場合にエラーが発生していたバグを修正しました (GH 12546)pd.read_csv()で、thousandsパラメータと共に日付として解析される場合に、インデックス列が誤って解析されていたバグを修正しました (GH 14066)engine='python'を使用したpd.read_csv()で、データが数値に変換された後にNaN値が検出されなかったバグを修正しました (GH 13314)pd.read_csv()で、nrows引数が両方のエンジンで適切に検証されていなかったバグを修正しました (GH 10476)engine='python'を使用したpd.read_csv()で、混合ケース形式の無限大が適切に解釈されていなかったバグを修正しました (GH 13274)engine='python'を使用したpd.read_csv()で、末尾のNaN値が解析されていなかったバグを修正しました (GH 13320)Python 3のWindowsで
tempfile.TemporaryFileから読み込む際のpd.read_csv()でengine='python'を使用する際のバグを修正しました (GH 13398)pd.read_csv()でusecolskwargがシングルバイトのUnicode文字列を受け付けなかったバグを修正しました (GH 13219)pd.read_csv()でusecolsが空のセットであることを妨げていたバグを修正しました (GH 13402)Cエンジンにおける
pd.read_csv()で、NULL文字がNULLとして解析されていなかったバグを修正しました (GH 14012)engine='c'を使用したpd.read_csv()で、quotingがNoneとして指定されていたにもかかわらず、NULLquotecharが受け入れられなかったバグを修正しました (GH 13411)engine='c'を使用したpd.read_csv()で、引用符が数値以外として指定された場合にフィールドが適切にfloatにキャストされなかったバグを修正しました (GH 13411)Python 2.xで非UTF8エンコードの複数文字区切りデータを持つ
pd.read_csv()のバグを修正しました (GH 3404)pd.read_csv()で、utf-xx (例: UTF-xx, UTF_xx, utf_xx) のエイリアスがUnicodeDecodeErrorを発生させていたバグを修正しました (GH 13549)pd.read_csv,pd.read_table,pd.read_fwf,pd.read_stataおよびpd.read_sasで、chunksizeとiteratorの両方がNoneの場合に、パーサーによってファイルが開かれたまま閉じられないバグを修正しました。 (GH 13940)StataReader,StataWriter,XportReaderおよびSAS7BDATReaderで、エラーが発生した場合にファイルが適切に閉じられなかったバグを修正しました。 (GH 13940)pd.pivot_table()で、aggfuncがリストの場合にmargins_nameが無視されていたバグを修正しました (GH 13354)pd.Series.str.zfill,center,ljust,rjust, およびpadで、非整数を渡した場合にTypeErrorが発生しなかったバグを修正しました (GH 13598)TimedeltaIndex内のNULLオブジェクトのチェックが常にTrueを返していたバグを修正しました (GH 13603)Seriesの算術演算で、objectdtype として日時のような値が含まれている場合にTypeErrorが発生していたバグを修正しました (GH 13043)Series.isnull()およびSeries.notnull()がPeriod('NaT')を無視していたバグを修正しました (GH 13737)Series.fillna()およびSeries.dropna()がPeriod('NaT')に影響を与えなかったバグを修正しました (GH 13737.fillna(value=np.nan)がcategorydtypedSeriesで誤ってKeyErrorを発生させていたバグを修正しました (GH 14021)拡張dtype作成で、作成された型が同一でなかったバグを修正しました (GH 13285)
.resample(..)で、IPythonの内省によって誤った警告がトリガーされていたバグを修正しました (GH 13618)NaT-PeriodがAttributeErrorを発生させていたバグを修正しました (GH 13071)rhsに
NaTが含まれている場合、Seriesの比較が誤った結果を出力する可能性があったバグを修正しました (GH 9005)object dtypeを持つ
NaTが含まれている場合、SeriesおよびIndexの比較が誤った結果を出力する可能性があったバグを修正しました (GH 13592)右辺に
Periodがある場合、Periodの加算がTypeErrorを発生させていたバグを修正しました (GH 13069)PeriodとSeriesまたはIndexの比較がTypeErrorを発生させていたバグを修正しました (GH 13200)pd.set_eng_float_format()がNaNとInfのフォーマットを妨げていたバグを修正しました (GH 11981)Categoricaldtype を持つ.unstackが.orderedをTrueにリセットしていたバグを修正しました (GH 13249)日時解析におけるいくつかのコンパイル時警告をクリーンアップしました (GH 13607)
データにDST境界付近の日時が含まれる場合、
factorizeがAmbiguousTimeErrorを発生させていたバグを修正しました (GH 13750)新しいインデックスがDST境界と複数レベルを含む場合、
.set_indexがAmbiguousTimeErrorを発生させていたバグを修正しました (GH 12920)データにDST境界付近の日時が含まれる場合、
.shiftがAmbiguousTimeErrorを発生させていたバグを修正しました (GH 13926)pd.read_hdf()が、categorical列を持つDataFrameと、値に一致しないクエリがある場合に誤った結果を返していたバグを修正しました (GH 13792)非lexsortedなMultiIndexでインデックスを作成する際の
.ilocのバグを修正しました (GH 13797)逆ソートされた
DatetimeIndexで日付文字列を使用してインデックスを作成する際の.locのバグを修正しました (GH 14316)ゼロ次元NumPy配列を扱う際の
Series比較演算子のバグを修正しました (GH 13006).combine_firstが誤ったdtypeを返す場合があったバグを修正しました (GH 7630, GH 10567)groupbyで、最初の結果がNoneかどうかによってapplyが異なる結果を返していたバグを修正しました (GH 12824).head()/.tail()の後に呼び出された場合、グループキーが矛盾して含まれるgroupby(..).nth()のバグを修正しました (GH 12839).to_html,.to_latexおよび.to_stringが、formattersキーワードを介して渡されたカスタム日時フォーマッタを黙って無視していたバグを修正しました (GH 10690)DataFrame.iterrows()で、定義されている場合にSeriesのサブクラスを生成しなかったバグを修正しました (GH 13977)errors='coerce'で入力にハッシュ不可能なオブジェクトが含まれている場合のpd.to_numericのバグを修正しました (GH 13324)無効な
Timedeltaの算術演算と比較がTypeErrorではなくValueErrorを発生させる場合があったバグを修正しました (GH 13624)to_datetimeおよびDatetimeIndexでの無効な日時解析がValueErrorではなくTypeErrorを発生させる場合があったバグを修正しました (GH 11169, GH 11287)tz-aware
Timestampと不一致のtzオプションで作成されたIndexがタイムゾーンを誤って型変換していたバグを修正しました (GH 13692)ナノ秒頻度を持つ
DatetimeIndexがendで指定されたタイムスタンプを含まなかったバグを修正しました (GH 13672)np.timedelta64を使用してスライスを設定する際のSeriesのバグを修正しました (GH 14155)Indexがobjectdtype に型変換するのではなく、datetimeがdatetime64[ns]境界を超える場合にOutOfBoundsDatetimeを発生させていたバグを修正しました (GH 13663)Indexがdtypeとして渡された指定されたdatetime64またはtimedelta64を無視する可能性があったバグを修正しました (GH 13981)RangeIndexがTypeErrorを発生させるのではなく、引数なしで作成できるバグを修正しました (GH 13793)データが
datetime64[ns]境界を超える場合、.value_counts()がOutOfBoundsDatetimeを発生させていたバグを修正しました (GH 13663)入力
np.datetime64がns以外の単位を持つ場合、DatetimeIndexがOutOfBoundsDatetimeを発生させる可能性があったバグを修正しました (GH 9114)ns以外の単位を持つnp.datetime64をobjectdtype として使用してSeriesを作成すると、誤った値になるバグを修正しました (GH 13876)timedeltaデータでデータがfloatにキャストされていた
resampleのバグを修正しました (GH 13119)。入力日時のようなオブジェクトが
ns以外の単位を持つ場合、pd.isnull()pd.notnull()がTypeErrorを発生させていたバグを修正しました (GH 13389)入力日時のようなオブジェクトが
ns以外の単位を持つ場合、pd.merge()がTypeErrorを発生させる場合があったバグを修正しました (GH 13389)HDFStore/read_hdf()がtzが設定されている場合にDatetimeIndex.nameを破棄していたバグを修正しました (GH 13884)Categorical.remove_unused_categories()が.codesのdtypeをプラットフォームのintに変更していたバグを修正しました (GH 13261)as_index=Falseを持つgroupbyが、カテゴリカルな列を含む複数の列でグループ化する際にすべてのNaNを返していたバグを修正しました (GH 13204)df.groupby(...)[...]でInt64Indexでgetitemを実行するとエラーが発生していたバグを修正しました (GH 13731)DataFrame.styleに割り当てられるCSSクラスのインデックス名のバグを修正しました。以前は"col_heading level<n> col<c>"が割り当てられていましたが、nはレベル数+1でした。現在は"index_name level<n>"が割り当てられており、nはそのMultiIndexの正しいレベルです。pd.read_gbq()が、apiclientという別のpythonパッケージとの命名競合の結果、ImportError: No module named discoveryをスローする可能性があったバグを修正しました (GH 13454)Index.unionが、名前付きの空のインデックスで誤った結果を返していたバグを修正しました (GH 13432)Index.differenceおよびDataFrame.joinのバグにより、混合整数インデックスを使用している場合にPython3でエラーが発生します (GH 13432, GH 12814)。タイムゾーン対応の
datetime.datetimeをタイムゾーン対応のdatetime64シリーズから減算する際のバグ (GH 14088)。DataFrameにNaN値を持つラベルを含むMultiIndexが含まれる場合に
.to_excel()のバグ (GH 13511)。"D1"、"-2-3H"などの無効な頻度オフセット文字列が
ValueErrorを発生させない可能性があるバグ (GH 13930)。RangeIndexレベルを持つ階層フレームでのconcatおよびgroupbyのバグ (GH 13542)。objectdtypeのNaN値のみを含むSeriesに対するSeries.str.contains()のバグ (GH 14171)。groupby dataframeの
agg()関数がdatetime64[ns]列のdtypeをfloat64に変更するバグ (GH 12821)。PeriodIndexでNumPy ufuncを使用して整数を加算または減算するとIncompatibleFrequencyが発生するバグ。標準演算子の方が効率的なパスを使用するため、+や-などの標準演算子を使用することを推奨します (GH 13980)。NaTに対する操作がdatetime64[ns]ではなくfloatを返すバグ (GH 12941)。Seriesの柔軟な算術メソッド(.add()など)がaxis=Noneの場合にValueErrorを発生させるバグ (GH 13894)。MultiIndex列を持つDataFrame.to_csv()で余分な空行が追加されるバグ (GH 6618)。DatetimeIndex、TimedeltaIndex、PeriodIndex.equals()が、入力がIndexではないが同じ値を含む場合にTrueを返す可能性があるバグ (GH 13107)。タイムゾーン付きの日時への代入が、夏時間境界付近の日時を含む場合に機能しない可能性があるバグ (GH 14146)。
Python 2で長い浮動小数点リテラルが切り捨てられる
pd.eval()およびHDFStoreクエリのバグ (GH 14241)。列がdfに存在せず、列に重複値が含まれる場合に、
Indexが誤った列を表示してKeyErrorを発生させるバグ (GH 13822)。頻度が結合オフセットエイリアスを持つ場合に
PeriodおよびPeriodIndexが誤った日付を作成するバグ (GH 13874)。整数
line_widthとindex=Falseを指定して.to_string()を呼び出すと、代入前にidxが参照されるためUnboundLocalError例外が発生するバグ。eval()でresolvers引数がリストを受け付けないバグ (GH 14095)。stack、get_dummies、make_axis_dummiesが(マルチ)インデックス内のカテゴリdtypeを保持しないバグ (GH 13854)。PeriodIndexは、pd.NaTを含むlistおよびarrayを受け入れるようになりました (GH 13430)。グループ化されたDataFrameに空のビンが含まれる場合に、
df.groupbyの.median()が任意の値を返すバグ (GH 13629)。Index.copy()でnameパラメータが無視されるバグ (GH 14302)。
貢献者#
今回のリリースには合計117名がパッチを貢献しました。名前に「+」が付いている方は初めて貢献した方です。
Adrien Emery +
Alex Alekseyev
Alex Vig +
Allen Riddell +
Amol +
Amol Agrawal +
Andy R. Terrel +
Anthonios Partheniou
Ben Kandel +
Bob Baxley +
Brett Rosen +
Camilo Cota +
Chris
Chris Grinolds
Chris Warth
Christian Hudon
Christopher C. Aycock
Daniel Siladji +
Douglas McNeil
Drewrey Lupton +
Eduardo Blancas Reyes +
Elliot Marsden +
エヴァン・ライト
Felix Marczinowski +
Francis T. O’Donovan
Geraint Duck +
Giacomo Ferroni +
Grant Roch +
Gábor Lipták
Haleemur Ali +
Hassan Shamim +
Iulius Curt +
Ivan Nazarov +
ジェフ・リーバック
Jeffrey Gerard +
Jenn Olsen +
Jim Crist
Joe Jevnik
John Evans +
John Freeman
John Liekezer +
John W. O’Brien
John Zwinck +
Johnny Gill +
Jordan Erenrich +
Joris Van den Bossche
Josh Howes +
Jozef Brandys +
カ・ウォ・チェン
Kamil Sindi +
カービー・シェデン
Kernc +
ケビン・シェパード
Matthieu Brucher +
Maximilian Roos
Michael Scherer +
Mike Graham +
モルタダ・メヒヤル
Muhammad Haseeb Tariq +
Nate George +
Neil Parley +
Nicolas Bonnotte
OXPHOS
Pan Deng / Zora +
Paul +
Paul Mestemaker +
Pauli Virtanen
Pawel Kordek +
ピエトロ・バティストン
Piotr Jucha +
Ravi Kumar Nimmi +
Robert Gieseke
Robert Kern +
ロジャー・トーマス
Roy Keyes +
Russell Smith +
Sahil Dua +
Sanjiv Lobo +
Sašo Stanovnik +
Shawn Heide +
Sinhrks
Stephen Kappel +
Steve Choi +
Stewart Henderson +
Sudarshan Konge +
トーマス・A・キャスウェル
Tom Augspurger
Tom Bird +
Uwe Hoffmann +
WillAyd +
Xiang Zhang +
YG-Riku +
Yadunandan +
ヤロスラフ・ハルチェンコ
Yuichiro Kaneko +
adneu
agraboso +
babakkeyvani +
c123w +
クリス・B1
cmazzullo +
conquistador1492 +
cr3 +
dsm054
ジーエフヤング
harshul1610 +
iamsimha +
jackieleng +
mpuels +
pijucha +
priyankjain +
sinhrks
wcwagner +
yui-knk +
zhangjinjie +
znmean +
颜发才(Yan Facai) +