バージョン 0.20.1 (2017年5月5日)#

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

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

  • groupby-rolling-resample APIに似たSeries/DataFrameの新しい.agg() APIについては、こちらを参照してください。

  • feather-formatとの統合。新しいトップレベルのpd.read_feather()およびDataFrame.to_feather()メソッドについては、こちらを参照してください。

  • .ixインデクサーは非推奨になりました。詳細はこちらを参照してください。

  • Panelは非推奨になりました。詳細はこちらを参照してください。

  • IntervalIndexIntervalスカラー型の追加については、こちらを参照してください。

  • .groupby()でインデックスレベルごとにグループ化する際のユーザーAPIの改善については、こちらを参照してください。

  • UInt64 dtypeのサポートの改善については、こちらを参照してください。

  • JSONシリアル化のための新しいorient、orient='table'。これはテーブルスキーマの仕様を使用し、Jupyter Notebookでよりインタラクティブな表現を可能にします。詳細はこちらを参照してください。

  • スタイル付きDataFrame (DataFrame.style) のExcelへのエクスポートの実験的サポートについては、こちらを参照してください。

  • ウィンドウのバイナリのcorr/cov操作は、Panelが非推奨になったため、PanelではなくMultiIndexed DataFrameを返すようになりました。詳細はこちらを参照してください。

  • S3ハンドリングのサポートはs3fsを使用するようになりました。詳細はこちらを参照してください。

  • Google BigQueryのサポートはpandas-gbqライブラリを使用するようになりました。詳細はこちらを参照してください。

警告

pandasはコードベースの内部構造とレイアウトを変更しました。これはトップレベルのpandas.*名前空間からのインポートに影響を与える可能性があります。変更についてはこちらを参照してください。

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

これは0.20.0と0.20.1の統合リリースです。バージョン0.20.1には、pandasのutilsルーチンを使用するダウンストリームプロジェクトとの下位互換性のための追加の変更が1つ含まれています。(GH 16250)

新機能#

DataFrame/Seriesのメソッドagg API#

Series & DataFrameが、集計APIをサポートするように強化されました。これは、groupby、ウィンドウ操作、リサンプリングでおなじみのAPIです。agg()transform()を使用することで、簡潔な方法で集計操作を実行できます。完全なドキュメントはこちらです (GH 1623)。

以下に例を示します。

In [1]: df = pd.DataFrame(np.random.randn(10, 3), columns=['A', 'B', 'C'],
   ...:                   index=pd.date_range('1/1/2000', periods=10))
   ...: 

In [2]: df.iloc[3:7] = np.nan

In [3]: df
Out[3]: 
                   A         B         C
2000-01-01  0.469112 -0.282863 -1.509059
2000-01-02 -1.135632  1.212112 -0.173215
2000-01-03  0.119209 -1.044236 -0.861849
2000-01-04       NaN       NaN       NaN
2000-01-05       NaN       NaN       NaN
2000-01-06       NaN       NaN       NaN
2000-01-07       NaN       NaN       NaN
2000-01-08  0.113648 -1.478427  0.524988
2000-01-09  0.404705  0.577046 -1.715002
2000-01-10 -1.039268 -0.370647 -1.157892

[10 rows x 3 columns]

文字列関数名、呼び出し可能オブジェクト、リスト、またはこれらの辞書を使用して操作できます。

単一の関数を使用することは.applyと同等です。

In [4]: df.agg('sum')
Out[4]: 
A   -1.068226
B   -1.387015
C   -4.892029
Length: 3, dtype: float64

関数のリストによる複数集計。

In [5]: df.agg(['sum', 'min'])
Out[5]: 
            A         B         C
sum -1.068226 -1.387015 -4.892029
min -1.135632 -1.478427 -1.715002

[2 rows x 3 columns]

辞書を使用すると、列ごとに特定の集計を適用できます。すべての集計関数の行列のような出力が得られます。出力は一意の関数ごとに1つの列を持ちます。特定の列に適用された関数はNaNになります。

In [6]: df.agg({'A': ['sum', 'min'], 'B': ['min', 'max']})
Out[6]: 
            A         B
sum -1.068226       NaN
min -1.135632 -1.478427
max       NaN  1.212112

[3 rows x 2 columns]

APIは、結果をブロードキャストするための.transform()関数もサポートしています。

In [7]: df.transform(['abs', lambda x: x - x.min()])
Out[7]: 
                   A                   B                   C          
                 abs  <lambda>       abs  <lambda>       abs  <lambda>
2000-01-01  0.469112  1.604745  0.282863  1.195563  1.509059  0.205944
2000-01-02  1.135632  0.000000  1.212112  2.690539  0.173215  1.541787
2000-01-03  0.119209  1.254841  1.044236  0.434191  0.861849  0.853153
2000-01-04       NaN       NaN       NaN       NaN       NaN       NaN
2000-01-05       NaN       NaN       NaN       NaN       NaN       NaN
2000-01-06       NaN       NaN       NaN       NaN       NaN       NaN
2000-01-07       NaN       NaN       NaN       NaN       NaN       NaN
2000-01-08  0.113648  1.249281  1.478427  0.000000  0.524988  2.239990
2000-01-09  0.404705  1.540338  0.577046  2.055473  1.715002  0.000000
2000-01-10  1.039268  0.096364  0.370647  1.107780  1.157892  0.557110

[10 rows x 6 columns]

集計できない混合データ型が提示された場合、.agg()は有効な集計のみを適用します。これは、groupby .agg()の動作に似ています。(GH 15015)

In [8]: df = pd.DataFrame({'A': [1, 2, 3],
   ...:                    'B': [1., 2., 3.],
   ...:                    'C': ['foo', 'bar', 'baz'],
   ...:                    'D': pd.date_range('20130101', periods=3)})
   ...: 

In [9]: df.dtypes
Out[9]: 
A             int64
B           float64
C            object
D    datetime64[ns]
Length: 4, dtype: object
In [10]: df.agg(['min', 'sum'])
Out[10]:
     A    B          C          D
min  1  1.0        bar 2013-01-01
sum  6  6.0  foobarbaz        NaT

データIOのキーワード引数dtype#

read_csv()'python'エンジン、固定幅テキストファイルを解析するためのread_fwf()関数、Excelファイルを解析するためのread_excel()は、特定の列の型を指定するためのdtypeキーワード引数を受け入れるようになりました (GH 14295)。詳細についてはio docsを参照してください。

In [10]: data = "a  b\n1  2\n3  4"

In [11]: pd.read_fwf(StringIO(data)).dtypes
Out[11]: 
a    int64
b    int64
Length: 2, dtype: object

In [12]: pd.read_fwf(StringIO(data), dtype={'a': 'float64', 'b': 'object'}).dtypes
Out[12]: 
a    float64
b     object
Length: 2, dtype: object

メソッド.to_datetime()originパラメータが追加されました#

to_datetime()に新しいパラメータoriginが追加され、特定のunitが指定された数値値を解析する際に、結果のタイムスタンプを計算するための基準日を定義できるようになりました。(GH 11276、GH 11745)

たとえば、開始日を1960-01-01とすると

In [13]: pd.to_datetime([1, 2, 3], unit='D', origin=pd.Timestamp('1960-01-01'))
Out[13]: DatetimeIndex(['1960-01-02', '1960-01-03', '1960-01-04'], dtype='datetime64[ns]', freq=None)

デフォルトはorigin='unix'に設定されており、これは一般的に「Unixエポック」またはPOSIX時間と呼ばれる1970-01-01 00:00:00がデフォルトとなります。これは以前のデフォルトだったので、後方互換性のある変更です。

In [14]: pd.to_datetime([1, 2, 3], unit='D')
Out[14]: DatetimeIndex(['1970-01-02', '1970-01-03', '1970-01-04'], dtype='datetime64[ns]', freq=None)

GroupByの機能強化#

DataFrame.groupby()byパラメータとして渡される文字列は、列名またはインデックスレベル名のいずれかを参照できるようになりました。以前は列名のみを参照できました。これにより、列とインデックスレベルを同時に簡単にグループ化できます。(GH 5677)

In [15]: arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
   ....:           ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
   ....: 

In [16]: index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])

In [17]: df = pd.DataFrame({'A': [1, 1, 1, 1, 2, 2, 3, 3],
   ....:                    'B': np.arange(8)},
   ....:                   index=index)
   ....: 

In [18]: df
Out[18]: 
              A  B
first second      
bar   one     1  0
      two     1  1
baz   one     1  2
      two     1  3
foo   one     2  4
      two     2  5
qux   one     3  6
      two     3  7

[8 rows x 2 columns]

In [19]: df.groupby(['second', 'A']).sum()
Out[19]: 
          B
second A   
one    1  2
       2  4
       3  6
two    1  4
       2  5
       3  7

[6 rows x 1 columns]

read_csvにおける圧縮URLのサポートの改善#

圧縮コードがリファクタリングされました (GH 12688)。その結果、read_csv()またはread_table()でのURLからのデータフレームの読み取りが、追加の圧縮メソッド(xzbz2zip)をサポートするようになりました (GH 14570)。以前はgzip圧縮のみがサポートされていました。デフォルトでは、URLとパスの圧縮はファイル拡張子を使用して推測されるようになりました。さらに、Python 2 C-engineでのbz2圧縮のサポートが改善されました (GH 14874)。

In [20]: url = ('https://github.com/{repo}/raw/{branch}/{path}'
   ....:        .format(repo='pandas-dev/pandas',
   ....:                branch='main',
   ....:                path='pandas/tests/io/parser/data/salaries.csv.bz2'))
   ....: 

# default, infer compression
In [21]: df = pd.read_csv(url, sep='\t', compression='infer')

# explicitly specify compression
In [22]: df = pd.read_csv(url, sep='\t', compression='bz2')

In [23]: df.head(2)
Out[23]: 
       S  X  E  M
0  13876  1  1  1
1  11608  1  3  0

[2 rows x 4 columns]

PickleファイルIOが圧縮をサポートするようになりました#

read_pickle()DataFrame.to_pickle()Series.to_pickle()が、圧縮されたPickleファイルの読み書きをサポートするようになりました。圧縮メソッドは明示的なパラメータとして指定することも、ファイル拡張子から推測することもできます。詳細についてはこちらのドキュメントを参照してください。

In [24]: df = pd.DataFrame({'A': np.random.randn(1000),
   ....:                    'B': 'foo',
   ....:                    'C': pd.date_range('20130101', periods=1000, freq='s')})
   ....: 

明示的な圧縮タイプを使用する

In [25]: df.to_pickle("data.pkl.compress", compression="gzip")

In [26]: rt = pd.read_pickle("data.pkl.compress", compression="gzip")

In [27]: rt.head()
Out[27]: 
          A    B                   C
0 -1.344312  foo 2013-01-01 00:00:00
1  0.844885  foo 2013-01-01 00:00:01
2  1.075770  foo 2013-01-01 00:00:02
3 -0.109050  foo 2013-01-01 00:00:03
4  1.643563  foo 2013-01-01 00:00:04

[5 rows x 3 columns]

デフォルトでは、拡張子から圧縮タイプを推測します (compression='infer')。

In [28]: df.to_pickle("data.pkl.gz")

In [29]: rt = pd.read_pickle("data.pkl.gz")

In [30]: rt.head()
Out[30]: 
          A    B                   C
0 -1.344312  foo 2013-01-01 00:00:00
1  0.844885  foo 2013-01-01 00:00:01
2  1.075770  foo 2013-01-01 00:00:02
3 -0.109050  foo 2013-01-01 00:00:03
4  1.643563  foo 2013-01-01 00:00:04

[5 rows x 3 columns]

In [31]: df["A"].to_pickle("s1.pkl.bz2")

In [32]: rt = pd.read_pickle("s1.pkl.bz2")

In [33]: rt.head()
Out[33]: 
0   -1.344312
1    0.844885
2    1.075770
3   -0.109050
4    1.643563
Name: A, Length: 5, dtype: float64

UInt64のサポートの改善#

pandasは、符号なし、または純粋な非負整数を含む操作のサポートを大幅に改善しました。以前は、これらの整数を処理すると、不適切な丸めやデータ型キャストが発生し、誤った結果につながることがありました。特に、新しい数値インデックスであるUInt64Indexが作成されました (GH 14937)。

In [1]: idx = pd.UInt64Index([1, 2, 3])
In [2]: df = pd.DataFrame({'A': ['a', 'b', 'c']}, index=idx)
In [3]: df.index
Out[3]: UInt64Index([1, 2, 3], dtype='uint64')
  • 配列のようなオブジェクトのオブジェクト要素を符号なし64ビット整数に変換する際のバグ (GH 4471、GH 14982)

  • 符号なし64ビット整数がオーバーフローを引き起こしていたSeries.unique()のバグ (GH 14721)

  • 符号なし64ビット整数要素がオブジェクトに変換されていたDataFrame構築のバグ (GH 14881)

  • 符号なし64ビット整数要素が誤ったデータ型に不適切に変換されていたpd.read_csv()のバグ (GH 14983)

  • 符号なし64ビット整数がオーバーフローを引き起こしていたpd.unique()のバグ (GH 14915)

  • 符号なし64ビット整数が出力で誤って切り捨てられていたpd.value_counts()のバグ (GH 14934)

カテゴリカルデータでのGroupBy#

以前のバージョンでは、データに表示されないカテゴリを持つカテゴリカルシリーズでグループ化すると、.groupby(..., sort=False)ValueErrorで失敗していました。(GH 13179)

In [34]: chromosomes = np.r_[np.arange(1, 23).astype(str), ['X', 'Y']]

In [35]: df = pd.DataFrame({
   ....:     'A': np.random.randint(100),
   ....:     'B': np.random.randint(100),
   ....:     'C': np.random.randint(100),
   ....:     'chromosomes': pd.Categorical(np.random.choice(chromosomes, 100),
   ....:                                   categories=chromosomes,
   ....:                                   ordered=True)})
   ....: 

In [36]: df
Out[36]: 
     A   B   C chromosomes
0   87  22  81           4
1   87  22  81          13
2   87  22  81          22
3   87  22  81           2
4   87  22  81           6
..  ..  ..  ..         ...
95  87  22  81           8
96  87  22  81          11
97  87  22  81           X
98  87  22  81           1
99  87  22  81          19

[100 rows x 4 columns]

以前の動作:

In [3]: df[df.chromosomes != '1'].groupby('chromosomes', observed=False, sort=False).sum()
---------------------------------------------------------------------------
ValueError: items in new_categories are not the same as in old categories

新しい動作:

In [37]: df[df.chromosomes != '1'].groupby('chromosomes', observed=False, sort=False).sum()
Out[37]: 
               A   B    C
chromosomes              
4            348  88  324
13           261  66  243
22           348  88  324
2            348  88  324
6            174  44  162
...          ...  ..  ...
3            348  88  324
11           348  88  324
19           174  44  162
1              0   0    0
21             0   0    0

[24 rows x 3 columns]

テーブルスキーマ出力#

DataFrame.to_json()の新しいorient 'table'は、テーブルスキーマ互換のデータ文字列表現を生成します。

In [38]: df = pd.DataFrame(
   ....:     {'A': [1, 2, 3],
   ....:      'B': ['a', 'b', 'c'],
   ....:      'C': pd.date_range('2016-01-01', freq='d', periods=3)},
   ....:     index=pd.Index(range(3), name='idx'))
   ....: 

In [39]: df
Out[39]: 
     A  B          C
idx                 
0    1  a 2016-01-01
1    2  b 2016-01-02
2    3  c 2016-01-03

[3 rows x 3 columns]

In [40]: df.to_json(orient='table')
Out[40]: '{"schema":{"fields":[{"name":"idx","type":"integer"},{"name":"A","type":"integer"},{"name":"B","type":"string"},{"name":"C","type":"datetime"}],"primaryKey":["idx"],"pandas_version":"1.4.0"},"data":[{"idx":0,"A":1,"B":"a","C":"2016-01-01T00:00:00.000"},{"idx":1,"A":2,"B":"b","C":"2016-01-02T00:00:00.000"},{"idx":2,"A":3,"B":"c","C":"2016-01-03T00:00:00.000"}]}'

詳細については、IO: テーブルスキーマを参照してください。

さらに、IPython (またはJupyterメッセージングプロトコルを使用するnteractなどの他のフロントエンド) を使用している場合、DataFrameおよびSeriesのreprは、SeriesまたはDataFrameのこのJSONテーブルスキーマ表現を公開できるようになりました。これにより、Jupyterノートブックやnteractなどのフロントエンドは、データに関するより多くの情報を持つため、pandasオブジェクトの表示方法に関してより柔軟になります。これを有効にするには、display.html.table_schemaオプションをTrueに設定する必要があります。

SparseDataFrameからのSciPyスパース行列#

pandasは、scipy.sparse.spmatrixインスタンスから直接疎データフレームを作成する機能をサポートするようになりました。詳細についてはドキュメントを参照してください。(GH 4343)

すべての疎形式がサポートされていますが、COOrdinate形式ではない行列は、必要に応じてデータをコピーして変換されます。

from scipy.sparse import csr_matrix
arr = np.random.random(size=(1000, 5))
arr[arr < .9] = 0
sp_arr = csr_matrix(arr)
sp_arr
sdf = pd.SparseDataFrame(sp_arr)
sdf

SparseDataFrameをCOO形式の疎SciPy行列に戻すには、次を使用します。

sdf.to_coo()

スタイル付きDataFrameのExcel出力#

openpyxlエンジンを使用してDataFrame.style形式をExcelにエクスポートする実験的サポートが追加されました。(GH 15530)

例えば、以下を実行すると、styled.xlsxは以下のようにレンダリングされます。

In [41]: np.random.seed(24)

In [42]: df = pd.DataFrame({'A': np.linspace(1, 10, 10)})

In [43]: df = pd.concat([df, pd.DataFrame(np.random.RandomState(24).randn(10, 4),
   ....:                                  columns=list('BCDE'))],
   ....:                axis=1)
   ....: 

In [44]: df.iloc[0, 2] = np.nan

In [45]: df
Out[45]: 
      A         B         C         D         E
0   1.0  1.329212       NaN -0.316280 -0.990810
1   2.0 -1.070816 -1.438713  0.564417  0.295722
2   3.0 -1.626404  0.219565  0.678805  1.889273
3   4.0  0.961538  0.104011 -0.481165  0.850229
4   5.0  1.453425  1.057737  0.165562  0.515018
5   6.0 -1.336936  0.562861  1.392855 -0.063328
6   7.0  0.121668  1.207603 -0.002040  1.627796
7   8.0  0.354493  1.037528 -0.385684  0.519818
8   9.0  1.686583 -1.325963  1.428984 -2.089354
9  10.0 -0.129820  0.631523 -0.586538  0.290720

[10 rows x 5 columns]

In [46]: styled = (df.style
   ....:           .applymap(lambda val: 'color:red;' if val < 0 else 'color:black;')
   ....:           .highlight_max())
   ....: 

In [47]: styled.to_excel('styled.xlsx', engine='openpyxl')
../_images/style-excel.png

詳細についてはStyle documentationを参照してください。

IntervalIndex#

pandasは、独自のdtypeであるintervalを持つIntervalIndexと、Intervalスカラー型を獲得しました。これにより、区間表記法がファーストクラスでサポートされ、特にcut()qcut()のカテゴリの戻り値の型としてサポートされます。IntervalIndexは独自のインデックス付けを可能にします。詳細はdocsを参照してください。(GH 7640、GH 8625)

警告

IntervalIndexのこれらのインデックス付け動作は暫定的なものであり、将来のpandasバージョンで変更される可能性があります。使用に関するフィードバックを歓迎します。

以前の動作

返されるカテゴリは文字列で、区間を表していました。

In [1]: c = pd.cut(range(4), bins=2)

In [2]: c
Out[2]:
[(-0.003, 1.5], (-0.003, 1.5], (1.5, 3], (1.5, 3]]
Categories (2, object): [(-0.003, 1.5] < (1.5, 3]]

In [3]: c.categories
Out[3]: Index(['(-0.003, 1.5]', '(1.5, 3]'], dtype='object')

新しい動作

In [48]: c = pd.cut(range(4), bins=2)

In [49]: c
Out[49]: 
[(-0.003, 1.5], (-0.003, 1.5], (1.5, 3.0], (1.5, 3.0]]
Categories (2, interval[float64, right]): [(-0.003, 1.5] < (1.5, 3.0]]

In [50]: c.categories
Out[50]: IntervalIndex([(-0.003, 1.5], (1.5, 3.0]], dtype='interval[float64, right]')

さらに、これにより、他のデータと同じビンでビン分割することができ、NaNは他のdtypeと同様に欠損値を表します。

In [51]: pd.cut([0, 3, 5, 1], bins=c.categories)
Out[51]: 
[(-0.003, 1.5], (1.5, 3.0], NaN, (-0.003, 1.5]]
Categories (2, interval[float64, right]): [(-0.003, 1.5] < (1.5, 3.0]]

IntervalIndexは、SeriesおよびDataFrameでインデックスとしても使用できます。

In [52]: df = pd.DataFrame({'A': range(4),
   ....:                    'B': pd.cut([0, 3, 1, 1], bins=c.categories)
   ....:                    }).set_index('B')
   ....: 

In [53]: df
Out[53]: 
               A
B               
(-0.003, 1.5]  0
(1.5, 3.0]     1
(-0.003, 1.5]  2
(-0.003, 1.5]  3

[4 rows x 1 columns]

特定の区間による選択

In [54]: df.loc[pd.Interval(1.5, 3.0)]
Out[54]: 
A    1
Name: (1.5, 3.0], Length: 1, dtype: int64

区間に含まれるスカラー値による選択。

In [55]: df.loc[0]
Out[55]: 
               A
B               
(-0.003, 1.5]  0
(-0.003, 1.5]  2
(-0.003, 1.5]  3

[3 rows x 1 columns]

その他の機能強化#

  • DataFrame.rolling()が、ローリングウィンドウの終点の閉鎖を選択するためのパラメータclosed='right'|'left'|'both'|'neither'を受け入れるようになりました。詳細についてはドキュメントを参照してください (GH 13965)。

  • feather-formatとの統合。新しいトップレベルのpd.read_feather()およびDataFrame.to_feather()メソッドについては、こちらを参照してください。

  • Series.str.replace()が、re.subに渡される置換として呼び出し可能オブジェクトを受け入れるようになりました (GH 15055)。

  • Series.str.replace()が、コンパイル済みの正規表現をパターンとして受け入れるようになりました (GH 15446)。

  • Series.sort_indexが、パラメータkindna_positionを受け入れるようになりました (GH 13589、GH 14444)。

  • DataFrameDataFrame.groupby()に、軸に沿った異なる値の数を数えるためのnunique()メソッドが追加されました (GH 14336、GH 15197)。

  • DataFrameに、ワイド形式からロング形式へアンピボットするためのpd.melt()と同等のmelt()メソッドが追加されました (GH 12640)。

  • pd.read_excel()が、sheetname=Noneを使用する際にシート順序を保持するようになりました (GH 9930)。

  • 小数点を含む複数のオフセットエイリアスがサポートされるようになりました (例: 0.5min30sとして解析されます) (GH 8419)。

  • Indexオブジェクトに.isnull().notnull()が追加され、Series APIとの一貫性が向上しました (GH 15300)。

  • ソートされていないMultiIndexにインデックス付け/スライスすると、新しいUnsortedIndexErrorKeyErrorのサブクラス)がスローされるようになりました (GH 11897)。これにより、ソート不足によるエラーと不正なキーによるエラーを区別できます。詳細はこちらを参照してください。

  • MultiIndexに、DataFrameに変換するための.to_frame()メソッドが追加されました (GH 12397)。

  • pd.cutpd.qcutがdatetime64とtimedelta64 dtypeをサポートするようになりました (GH 14714、GH 14798)。

  • pd.qcutに、重複したエッジでエラーを発生させるかどうかを制御するためのduplicates='raise'|'drop'オプションが追加されました (GH 7751)。

  • SeriesがExcelファイルを出力するためのto_excelメソッドを提供します (GH 8825)。

  • pd.read_csv()usecols引数が、値として呼び出し可能関数を受け入れるようになりました (GH 14154)。

  • pd.read_csv()skiprows引数が、値として呼び出し可能関数を受け入れるようになりました (GH 10882)。

  • pd.read_csv()nrowschunksize引数は、両方が渡された場合にサポートされます (GH 6774、GH 15755)。

  • DataFrame.plotは、suplots=Truetitleが文字列のリストである場合、各サブプロットの上にタイトルを表示するようになりました (GH 14753)。

  • DataFrame.plotは、matplotlib 2.0のデフォルトのカラーサイクルを単一の文字列としてカラーパラメータに渡せるようになりました。詳細はこちらを参照してください。(GH 15516)

  • Series.interpolate()が、method='time'でtimedeltaをインデックス型としてサポートするようになりました (GH 6424)。

  • MultiIndexの指定されたレベルのラベル名を変更するために、DataFrame/Series.renamelevelキーワードが追加されました (GH 4160)。

  • DataFrame.reset_index()は、タプルのindex.nameを、columnsMultiIndexである場合、そのレベルをまたがるキーとして解釈するようになりました (GH 16164)。

  • Timedelta.isoformatメソッドが追加され、TimedeltaをISO 8601期間としてフォーマットできるようになりました。詳細についてはTimedelta docsを参照してください (GH 15136)。

  • .select_dtypes()が、タイムゾーン付きのdatetimeを汎用的に選択するために文字列datetimetzを許可するようになりました (GH 14910)。

  • .to_latex()メソッドが、付属のLaTeX拡張機能を使用するためにmulticolumnおよびmultirow引数を受け入れるようになりました。

  • pd.merge_asof()direction='backward'|'forward'|'nearest'オプションが追加されました (GH 14887)。

  • Series/DataFrame.asfreq()に、欠損値を埋めるためのfill_valueパラメータが追加されました (GH 3715)。

  • Series/DataFrame.resample.asfreqに、リサンプリング中の欠損値を埋めるためのfill_valueパラメータが追加されました (GH 3715)。

  • pandas.util.hash_pandas_object()MultiIndexをハッシュする機能を追加しました (GH 15224)。

  • Series/DataFrame.squeeze()axisパラメータが追加されました。(GH 15339)

  • DataFrame.to_excel()に新しいfreeze_panesパラメータが追加され、Excelへのエクスポート時にウィンドウ枠の固定をオンにできるようになりました (GH 15160)。

  • pd.read_html()が複数のヘッダー行を解析し、MultiIndexヘッダーを作成するようになりました (GH 13434)。

  • HTMLテーブル出力は、colspanまたはrowspan属性が1の場合にスキップするようになりました。(GH 15403)

  • pandas.io.formats.style.Stylerテンプレートに、拡張しやすくするためにブロックが追加されました。詳細については例のノートブックを参照してください (GH 15649)。

  • Styler.render()**kwargsを受け入れるようになり、テンプレート内でユーザー定義変数を許可するようになりました (GH 15649)。

  • Jupyter notebook 5.0との互換性; MultiIndex列ラベルは左揃え、MultiIndex行ラベルは上揃えになりました (GH 15379)。

  • TimedeltaIndexが、ナノ秒レベルの精度に特化して設計されたカスタムの日付目盛りフォーマッタを持つようになりました (GH 8711)。

  • pd.api.types.union_categoricalsignore_ordered引数が追加され、結合されたカテゴリカルの順序属性を無視できるようになりました (GH 13410)。詳細についてはcategorical union docsを参照してください。

  • DataFrame.to_latex()DataFrame.to_string()が、オプションでヘッダーエイリアスを許可するようになりました。(GH 15536)

  • pd.read_excel()parse_datesキーワードが、文字列列を日付として解析するために再度有効になりました (GH 14326)。

  • Indexのサブクラスに.emptyプロパティが追加されました。(GH 15270)

  • TimedeltaおよびTimedeltaIndexに対する床除算が有効になりました (GH 15828)。

  • pandas.io.json.json_normalize()errors='ignore'|'raise'オプションが追加されました。デフォルトはerrors='raise'で、これは後方互換性があります。(GH 14583)

  • 空のlistを持つpandas.io.json.json_normalize()は、空のDataFrameを返します (GH 15534)。

  • pandas.io.json.json_normalize()に、結合されたフィールドを区切るためのstrを受け入れるsepオプションが追加されました。デフォルトは"."で、これは後方互換性があります。(GH 14883)

  • MultiIndex.remove_unused_levels()が追加され、未使用のレベルを削除するのが容易になりました。(GH 15694)

  • pd.read_csv()は、解析エラーが発生した場合にParserErrorエラーを発生させるようになりました (GH 15913、GH 15925)。

  • pd.read_csv()が、Pythonパーサーに対してerror_bad_linesおよびwarn_bad_lines引数をサポートするようになりました (GH 15925)。

  • display.show_dimensionsオプションは、Seriesのreprにその長さが表示されるかどうかを指定するためにも使用できるようになりました (GH 7117)。

  • parallel_coordinates()sort_labelsキーワード引数が追加され、クラスラベルとそれらに割り当てられた色がソートされるようになりました (GH 15908)。

  • bottlenecknumexprの使用をオン/オフするオプションが追加されました。詳細はこちらを参照してください (GH 16157)。

  • DataFrame.style.bar()が、棒グラフをさらにカスタマイズするための2つのオプションを受け入れるようになりました。棒の配置はalign='left'|'mid'|'zero'で設定され、デフォルトは「left」で後方互換性があります。また、color=[color_negative, color_positive]のリストを渡すことができるようになりました。(GH 14757)

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

pandas < 0.13.0で作成されたHDF5形式の互換性の可能性のある問題#

pd.TimeSeriesは、0.13.0以降すでにエイリアスでしたが、0.17.0で正式に非推奨となりました。pd.Seriesに置き換えられました。(GH 15098)。

これにより、以前のバージョンでpd.TimeSeriesを使用して作成されたHDF5ファイルが読み取れなくなる可能性があります。これはpandas < 0.13.0の場合に最も起こりやすいです。この状況になった場合、最近の以前のバージョンのpandasを使用してHDF5ファイルを読み込み、以下の手順を適用してから再度書き出すことができます。

In [2]: s = pd.TimeSeries([1, 2, 3], index=pd.date_range('20130101', periods=3))

In [3]: s
Out[3]:
2013-01-01    1
2013-01-02    2
2013-01-03    3
Freq: D, dtype: int64

In [4]: type(s)
Out[4]: pandas.core.series.TimeSeries

In [5]: s = pd.Series(s)

In [6]: s
Out[6]:
2013-01-01    1
2013-01-02    2
2013-01-03    3
Freq: D, dtype: int64

In [7]: type(s)
Out[7]: pandas.core.series.Series

インデックス型でのマップが他のインデックス型を返すようになりました#

Indexでのmapが、NumPy配列ではなくIndexを返すようになりました (GH 12766)。

In [56]: idx = pd.Index([1, 2])

In [57]: idx
Out[57]: Index([1, 2], dtype='int64')

In [58]: mi = pd.MultiIndex.from_tuples([(1, 2), (2, 4)])

In [59]: mi
Out[59]: 
MultiIndex([(1, 2),
            (2, 4)],
           )

以前の動作

In [5]: idx.map(lambda x: x * 2)
Out[5]: array([2, 4])

In [6]: idx.map(lambda x: (x, x * 2))
Out[6]: array([(1, 2), (2, 4)], dtype=object)

In [7]: mi.map(lambda x: x)
Out[7]: array([(1, 2), (2, 4)], dtype=object)

In [8]: mi.map(lambda x: x[0])
Out[8]: array([1, 2])

新しい動作

In [60]: idx.map(lambda x: x * 2)
Out[60]: Index([2, 4], dtype='int64')

In [61]: idx.map(lambda x: (x, x * 2))
Out[61]: 
MultiIndex([(1, 2),
            (2, 4)],
           )

In [62]: mi.map(lambda x: x)
Out[62]: 
MultiIndex([(1, 2),
            (2, 4)],
           )

In [63]: mi.map(lambda x: x[0])
Out[63]: Index([1, 2], dtype='int64')

datetime64値を持つSeriesでのmapは、int32ではなくint64 dtypeを返す場合があります。

In [64]: s = pd.Series(pd.date_range('2011-01-02T00:00', '2011-01-02T02:00', freq='H')
   ....:               .tz_localize('Asia/Tokyo'))
   ....:

In [65]: s
Out[65]:
0   2011-01-02 00:00:00+09:00
1   2011-01-02 01:00:00+09:00
2   2011-01-02 02:00:00+09:00
Length: 3, dtype: datetime64[ns, Asia/Tokyo]

以前の動作

In [9]: s.map(lambda x: x.hour)
Out[9]:
0    0
1    1
2    2
dtype: int32

新しい動作

In [66]: s.map(lambda x: x.hour)
Out[66]:
0    0
1    1
2    2
Length: 3, dtype: int64

インデックスのdatetimeフィールドへのアクセスがインデックスを返すようになりました#

DatetimeIndexPeriodIndexTimedeltaIndexのdatetime関連属性(概要はこちらを参照)は、以前はNumPy配列を返していました。これらは、ブールフィールドの場合を除き、新しいIndexオブジェクトを返すようになりました。ブールフィールドの場合、結果は引き続きブールnd配列になります。(GH 15022)

以前の動作

In [1]: idx = pd.date_range("2015-01-01", periods=5, freq='10H')

In [2]: idx.hour
Out[2]: array([ 0, 10, 20,  6, 16], dtype=int32)

新しい動作

In [67]: idx = pd.date_range("2015-01-01", periods=5, freq='10H')

In [68]: idx.hour
Out[68]: Index([0, 10, 20, 6, 16], dtype='int32')

これにより、特定のIndexメソッドが結果に対して引き続き利用可能であるという利点があります。一方、これには後方互換性の問題がある可能性があります。たとえば、NumPy配列と比較して、Indexオブジェクトは変更できません。元のndarrayを取得するには、常にnp.asarray(idx.hour)を使用して明示的に変換できます。

pd.uniqueは拡張型と一貫するようになります#

以前のバージョンでは、Categoricalおよびタイムゾーン対応のデータ型に対してSeries.unique()およびpandas.unique()を使用すると、異なる戻り値の型が生成されていました。これらは一貫性を持つようになりました。(GH 15903)

  • Datetime tz-aware

    以前の動作

    # Series
    In [5]: pd.Series([pd.Timestamp('20160101', tz='US/Eastern'),
       ...:            pd.Timestamp('20160101', tz='US/Eastern')]).unique()
    Out[5]: array([Timestamp('2016-01-01 00:00:00-0500', tz='US/Eastern')], dtype=object)
    
    In [6]: pd.unique(pd.Series([pd.Timestamp('20160101', tz='US/Eastern'),
       ...:                      pd.Timestamp('20160101', tz='US/Eastern')]))
    Out[6]: array(['2016-01-01T05:00:00.000000000'], dtype='datetime64[ns]')
    
    # Index
    In [7]: pd.Index([pd.Timestamp('20160101', tz='US/Eastern'),
       ...:           pd.Timestamp('20160101', tz='US/Eastern')]).unique()
    Out[7]: DatetimeIndex(['2016-01-01 00:00:00-05:00'], dtype='datetime64[ns, US/Eastern]', freq=None)
    
    In [8]: pd.unique([pd.Timestamp('20160101', tz='US/Eastern'),
       ...:            pd.Timestamp('20160101', tz='US/Eastern')])
    Out[8]: array(['2016-01-01T05:00:00.000000000'], dtype='datetime64[ns]')
    

    新しい動作

    # Series, returns an array of Timestamp tz-aware
    In [64]: pd.Series([pd.Timestamp(r'20160101', tz=r'US/Eastern'),
       ....:            pd.Timestamp(r'20160101', tz=r'US/Eastern')]).unique()
       ....: 
    Out[64]: 
    <DatetimeArray>
    ['2016-01-01 00:00:00-05:00']
    Length: 1, dtype: datetime64[ns, US/Eastern]
    
    In [65]: pd.unique(pd.Series([pd.Timestamp('20160101', tz='US/Eastern'),
       ....:           pd.Timestamp('20160101', tz='US/Eastern')]))
       ....: 
    Out[65]: 
    <DatetimeArray>
    ['2016-01-01 00:00:00-05:00']
    Length: 1, dtype: datetime64[ns, US/Eastern]
    
    # Index, returns a DatetimeIndex
    In [66]: pd.Index([pd.Timestamp('20160101', tz='US/Eastern'),
       ....:           pd.Timestamp('20160101', tz='US/Eastern')]).unique()
       ....: 
    Out[66]: DatetimeIndex(['2016-01-01 00:00:00-05:00'], dtype='datetime64[ns, US/Eastern]', freq=None)
    
    In [67]: pd.unique(pd.Index([pd.Timestamp('20160101', tz='US/Eastern'),
       ....:                     pd.Timestamp('20160101', tz='US/Eastern')]))
       ....: 
    Out[67]: DatetimeIndex(['2016-01-01 00:00:00-05:00'], dtype='datetime64[ns, US/Eastern]', freq=None)
    
  • カテゴリカル

    以前の動作

    In [1]: pd.Series(list('baabc'), dtype='category').unique()
    Out[1]:
    [b, a, c]
    Categories (3, object): [b, a, c]
    
    In [2]: pd.unique(pd.Series(list('baabc'), dtype='category'))
    Out[2]: array(['b', 'a', 'c'], dtype=object)
    

    新しい動作

    # returns a Categorical
    In [68]: pd.Series(list('baabc'), dtype='category').unique()
    Out[68]: 
    ['b', 'a', 'c']
    Categories (3, object): ['a', 'b', 'c']
    
    In [69]: pd.unique(pd.Series(list('baabc'), dtype='category'))
    Out[69]: 
    ['b', 'a', 'c']
    Categories (3, object): ['a', 'b', 'c']
    

S3ファイルハンドリング#

pandasはS3接続のハンドリングにs3fsを使用するようになりました。これにより既存のコードが壊れることはないはずです。ただし、s3fsは必須の依存関係ではないため、以前のバージョンのpandasのbotoと同様に、別途インストールする必要があります。(GH 11915)。

部分文字列インデックスの変更#

DatetimeIndexの部分文字列インデックスが、文字列の解決とインデックスの解決が一致する場合、両方が秒単位である場合を含め、厳密な一致として機能するようになりました (GH 14826)。詳細についてはスライス vs. 厳密な一致を参照してください。

In [70]: df = pd.DataFrame({'a': [1, 2, 3]}, pd.DatetimeIndex(['2011-12-31 23:59:59',
   ....:                                                       '2012-01-01 00:00:00',
   ....:                                                       '2012-01-01 00:00:01']))
   ....: 

以前の動作

In [4]: df['2011-12-31 23:59:59']
Out[4]:
                       a
2011-12-31 23:59:59  1

In [5]: df['a']['2011-12-31 23:59:59']
Out[5]:
2011-12-31 23:59:59    1
Name: a, dtype: int64

新しい動作

In [4]: df['2011-12-31 23:59:59']
KeyError: '2011-12-31 23:59:59'

In [5]: df['a']['2011-12-31 23:59:59']
Out[5]: 1

異なるfloat dtypeの連結は自動的にアップキャストされません#

以前は、異なるfloat dtypesを持つ複数のオブジェクトをconcatすると、結果が自動的にfloat64 dtypeにアップキャストされていました。現在では、最小限許容されるdtypeが使用されます (GH 13247)。

In [71]: df1 = pd.DataFrame(np.array([1.0], dtype=np.float32, ndmin=2))

In [72]: df1.dtypes
Out[72]: 
0    float32
Length: 1, dtype: object

In [73]: df2 = pd.DataFrame(np.array([np.nan], dtype=np.float32, ndmin=2))

In [74]: df2.dtypes
Out[74]: 
0    float32
Length: 1, dtype: object

以前の動作

In [7]: pd.concat([df1, df2]).dtypes
Out[7]:
0    float64
dtype: object

新しい動作

In [75]: pd.concat([df1, df2]).dtypes
Out[75]: 
0    float32
Length: 1, dtype: object

pandas Google BigQueryのサポートが移動しました#

pandasはGoogle BigQueryのサポートをpandas-gbqという別のパッケージに分割しました。conda install pandas-gbq -c conda-forgeまたはpip install pandas-gbqでインストールできます。read_gbq()DataFrame.to_gbq()の機能は、現在リリースされているpandas-gbq=0.1.4と同じままです。ドキュメントはこちらでホストされるようになりました (GH 15347)。

インデックスのメモリ使用量がより正確になりました#

以前のバージョンでは、インデックスを持つpandas構造で.memory_usage()を表示すると、実際のインデックス値のみが含まれ、高速なインデックス付けを容易にする構造は含まれていませんでした。これは、IndexMultiIndexでは一般的に異なり、他のインデックス型ではそれほどではありません。(GH 15237)

以前の動作

In [8]: index = pd.Index(['foo', 'bar', 'baz'])

In [9]: index.memory_usage(deep=True)
Out[9]: 180

In [10]: index.get_loc('foo')
Out[10]: 0

In [11]: index.memory_usage(deep=True)
Out[11]: 180

新しい動作

In [8]: index = pd.Index(['foo', 'bar', 'baz'])

In [9]: index.memory_usage(deep=True)
Out[9]: 180

In [10]: index.get_loc('foo')
Out[10]: 0

In [11]: index.memory_usage(deep=True)
Out[11]: 260

DataFrame.sort_indexの変更#

特定のケースでは、MultiIndexed DataFrameで.sort_index()を呼び出すと、ソートされていないように見えても、同じDataFrameが返されました。これは、lexsortedであるが非単調なレベルで発生しました。(GH 15622、GH 15687、GH 14015、GH 13431、GH 15797)

これは以前のバージョンから変更されていませんが、説明のために示しています。

In [81]: df = pd.DataFrame(np.arange(6), columns=['value'],
   ....:                   index=pd.MultiIndex.from_product([list('BA'), range(3)]))
   ....:
In [82]: df

Out[82]:
     value
B 0      0
  1      1
  2      2
A 0      3
  1      4
  2      5

[6 rows x 1 columns]
In [87]: df.index.is_lexsorted()
Out[87]: False

In [88]: df.index.is_monotonic
Out[88]: False

ソートは期待通りに機能します。

In [76]: df.sort_index()
Out[76]: 
                     a
2011-12-31 23:59:59  1
2012-01-01 00:00:00  2
2012-01-01 00:00:01  3

[3 rows x 1 columns]
In [90]: df.sort_index().index.is_lexsorted()
Out[90]: True

In [91]: df.sort_index().index.is_monotonic
Out[91]: True

しかし、この例では、非単調な第2レベルを持つため、期待通りの動作をしません。

In [77]: df = pd.DataFrame({'value': [1, 2, 3, 4]},
   ....:                   index=pd.MultiIndex([['a', 'b'], ['bb', 'aa']],
   ....:                                       [[0, 0, 1, 1], [0, 1, 0, 1]]))
   ....: 

In [78]: df
Out[78]: 
      value
a bb      1
  aa      2
b bb      3
  aa      4

[4 rows x 1 columns]

以前の動作

In [11]: df.sort_index()
Out[11]:
      value
a bb      1
  aa      2
b bb      3
  aa      4

In [14]: df.sort_index().index.is_lexsorted()
Out[14]: True

In [15]: df.sort_index().index.is_monotonic
Out[15]: False

新しい動作

In [94]: df.sort_index()
Out[94]:
      value
a aa      2
  bb      1
b aa      4
  bb      3

[4 rows x 1 columns]

In [95]: df.sort_index().index.is_lexsorted()
Out[95]: True

In [96]: df.sort_index().index.is_monotonic
Out[96]: True

GroupByの書式設定#

groupby.describe()の出力形式が変更され、describe()のメトリクスがインデックスではなく列に表示されるようになりました。この形式は、複数の関数を一度に適用する際のgroupby.agg()と一貫しています。(GH 4792)

以前の動作

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

In [2]: df.groupby('A').describe()
Out[2]:
                B
A
1 count  2.000000
  mean   1.500000
  std    0.707107
  min    1.000000
  25%    1.250000
  50%    1.500000
  75%    1.750000
  max    2.000000
2 count  2.000000
  mean   3.500000
  std    0.707107
  min    3.000000
  25%    3.250000
  50%    3.500000
  75%    3.750000
  max    4.000000

In [3]: df.groupby('A').agg(["mean", "std", "min", "max"])
Out[3]:
     B
  mean       std amin amax
A
1  1.5  0.707107    1    2
2  3.5  0.707107    3    4

新しい動作

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

In [80]: df.groupby('A').describe()
Out[80]: 
      B                                          
  count mean       std  min   25%  50%   75%  max
A                                                
1   2.0  1.5  0.707107  1.0  1.25  1.5  1.75  2.0
2   2.0  3.5  0.707107  3.0  3.25  3.5  3.75  4.0

[2 rows x 8 columns]

In [81]: df.groupby('A').agg(["mean", "std", "min", "max"])
Out[81]: 
     B                  
  mean       std min max
A                       
1  1.5  0.707107   1   2
2  3.5  0.707107   3   4

[2 rows x 4 columns]

ウィンドウのバイナリのcorr/cov操作がMultiIndex DataFrameを返すようになりました#

.rolling(..).expanding(..)、または.ewm(..)オブジェクトに対する.corr().cov()のようなバイナリウィンドウ操作は、Panelが非推奨になったため、Panelではなく2レベルのMultiIndexed DataFrameを返すようになりました。詳細はこちらを参照してください。これらは機能的には同等ですが、MultiIndexed DataFrameはpandasでより多くのサポートを受けています。詳細についてはウィンドウバイナリ操作のセクションを参照してください。(GH 15677)

In [82]: np.random.seed(1234)

In [83]: df = pd.DataFrame(np.random.rand(100, 2),
   ....:                   columns=pd.Index(['A', 'B'], name='bar'),
   ....:                   index=pd.date_range('20160101',
   ....:                                       periods=100, freq='D', name='foo'))
   ....: 

In [84]: df.tail()
Out[84]: 
bar                A         B
foo                           
2016-04-05  0.640880  0.126205
2016-04-06  0.171465  0.737086
2016-04-07  0.127029  0.369650
2016-04-08  0.604334  0.103104
2016-04-09  0.802374  0.945553

[5 rows x 2 columns]

以前の動作

In [2]: df.rolling(12).corr()
Out[2]:
<class 'pandas.core.panel.Panel'>
Dimensions: 100 (items) x 2 (major_axis) x 2 (minor_axis)
Items axis: 2016-01-01 00:00:00 to 2016-04-09 00:00:00
Major_axis axis: A to B
Minor_axis axis: A to B

新しい動作

In [85]: res = df.rolling(12).corr()

In [86]: res.tail()
Out[86]: 
bar                    A         B
foo        bar                    
2016-04-07 B   -0.132090  1.000000
2016-04-08 A    1.000000 -0.145775
           B   -0.145775  1.000000
2016-04-09 A    1.000000  0.119645
           B    0.119645  1.000000

[5 rows x 2 columns]

断面の相関行列の取得

In [87]: df.rolling(12).corr().loc['2016-04-07']
Out[87]: 
bar        A        B
bar                  
A    1.00000 -0.13209
B   -0.13209  1.00000

[2 rows x 2 columns]

HDFStoreのwhere文字列比較#

以前のバージョンでは、ほとんどの型はHDFStore内の文字列列と比較でき、通常は無効な比較になり、空の結果フレームを返していました。これらの比較は、現在TypeErrorを発生させるようになりました (GH 15492)。

In [88]: df = pd.DataFrame({'unparsed_date': ['2014-01-01', '2014-01-01']})

In [89]: df.to_hdf('store.h5', key='key', format='table', data_columns=True)

In [90]: df.dtypes
Out[90]: 
unparsed_date    object
Length: 1, dtype: object

以前の動作

In [4]: pd.read_hdf('store.h5', 'key', where='unparsed_date > ts')
File "<string>", line 1
  (unparsed_date > 1970-01-01 00:00:01.388552400)
                        ^
SyntaxError: invalid token

新しい動作

In [18]: ts = pd.Timestamp('2014-01-01')

In [19]: pd.read_hdf('store.h5', 'key', where='unparsed_date > ts')
TypeError: Cannot compare 2014-01-01 00:00:00 of
type <class 'pandas.tslib.Timestamp'> to string column

Index.intersectionと内部結合が左のIndexの順序を保持するようになりました#

Index.intersection()は、呼び出し元のIndex(左)の順序を、他のIndex(右)の順序ではなく、保持するようになりました (GH 15582)。これは内部結合、DataFrame.join()merge()、および.alignメソッドに影響を与えます。

  • Index.intersection

    In [91]: left = pd.Index([2, 1, 0])
    
    In [92]: left
    Out[92]: Index([2, 1, 0], dtype='int64')
    
    In [93]: right = pd.Index([1, 2, 3])
    
    In [94]: right
    Out[94]: Index([1, 2, 3], dtype='int64')
    

    以前の動作

    In [4]: left.intersection(right)
    Out[4]: Int64Index([1, 2], dtype='int64')
    

    新しい動作

    In [95]: left.intersection(right)
    Out[95]: Index([2, 1], dtype='int64')
    
  • DataFrame.joinpd.merge

    In [96]: left = pd.DataFrame({'a': [20, 10, 0]}, index=[2, 1, 0])
    
    In [97]: left
    Out[97]: 
        a
    2  20
    1  10
    0   0
    
    [3 rows x 1 columns]
    
    In [98]: right = pd.DataFrame({'b': [100, 200, 300]}, index=[1, 2, 3])
    
    In [99]: right
    Out[99]: 
         b
    1  100
    2  200
    3  300
    
    [3 rows x 1 columns]
    

    以前の動作

    In [4]: left.join(right, how='inner')
    Out[4]:
       a    b
    1  10  100
    2  20  200
    

    新しい動作

    In [100]: left.join(right, how='inner')
    Out[100]: 
        a    b
    2  20  200
    1  10  100
    
    [2 rows x 2 columns]
    

ピボットテーブルは常にDataFrameを返します#

pivot_table()のドキュメントには、常に DataFrameが返されると記載されています。ここでは、特定の状況下でSeriesが返される可能性があったバグが修正されました。(GH 4386)

In [101]: df = pd.DataFrame({'col1': [3, 4, 5],
   .....:                    'col2': ['C', 'D', 'E'],
   .....:                    'col3': [1, 3, 9]})
   .....: 

In [102]: df
Out[102]: 
   col1 col2  col3
0     3    C     1
1     4    D     3
2     5    E     9

[3 rows x 3 columns]

以前の動作

In [2]: df.pivot_table('col1', index=['col3', 'col2'], aggfunc="sum")
Out[2]:
col3  col2
1     C       3
3     D       4
9     E       5
Name: col1, dtype: int64

新しい動作

In [103]: df.pivot_table('col1', index=['col3', 'col2'], aggfunc="sum")
Out[103]: 
           col1
col3 col2      
1    C        3
3    D        4
9    E        5

[3 rows x 1 columns]

その他の API の変更#

  • numexprのバージョンは2.4.6以上である必要があり、この要件が満たされていない場合は全く使用されません (GH 15213)。

  • CParserErrorpd.read_csv()ParserErrorに名前が変更され、将来的に削除されます (GH 12665)。

  • SparseArray.cumsum()SparseSeries.cumsum()は、それぞれ常にSparseArraySparseSeriesを返すようになります (GH 12855)。

  • 空のDataFrameDataFrame.applymap()を使用すると、Seriesではなく空のDataFrameのコピーが返されます (GH 8222)。

  • Series.map()が、__missing__メソッドを持つ辞書サブクラス(例:collections.Counter)のデフォルト値を尊重するようになりました (GH 15999)。

  • .locは、イテレータとNamedTupleを受け入れる点で.ixと互換性があります (GH 15120)。

  • interpolate()fillna()は、limitキーワード引数が0より大きくない場合、ValueErrorを発生させるようになりました。(GH 9217)

  • pd.read_csv()は、dialectパラメータとユーザーによって提供された値が競合する場合、ParserWarningを発行するようになりました (GH 14898)。

  • pd.read_csv()は、Cエンジンで引用符文字が1バイトよりも大きい場合、ValueErrorを発生させるようになりました (GH 11592)。

  • inplace引数はブール値である必要があり、そうでない場合はValueErrorがスローされます (GH 14189)。

  • pandas.api.types.is_datetime64_ns_dtypeは、pandas.api.types.is_datetime64_any_dtypeと同様に、タイムゾーン対応のdtypeに対してTrueを報告するようになりました。

  • DataFrame.asof()は、一致が見つからなかった場合、スカラーNaNではなくnullで埋められたSeriesを返すようになりました (GH 15118)。

  • NDFrameオブジェクトでのcopy.copy()およびcopy.deepcopy()関数の具体的なサポート (GH 15444)

  • Series.sort_values()が、DataFrame.sort_values()の動作との一貫性のために、ブールの1要素リストを受け入れるようになりました (GH 15604)。

  • category dtypeの列に対する.merge().join()は、可能な限りカテゴリdtypeを保持するようになりました (GH 10409)。

  • SparseDataFrame.default_fill_valueは0になります。以前はpd.get_dummies(..., sparse=True)からの戻り値ではnanでした (GH 15594)。

  • Series.str.matchのデフォルトの動作が、グループの抽出からパターンのマッチングに変更されました。抽出動作はpandasバージョン0.13.0から非推奨となっており、Series.str.extractメソッドで実行できます (GH 5224)。その結果、as_indexerキーワードは無視され(新しい動作を指定するために不要)、非推奨になりました。

  • NaTが、is_month_startのようなdatetimelikeなブール演算に対して、正しくFalseを報告するようになりました (GH 15781)。

  • NaTは、TimedeltaおよびPeriodアクセッサ(例:daysquarter)に対して、正しくnp.nanを返すようになりました (GH 15782)。

  • NaTは、tz_localizeおよびtz_convertメソッドに対してNaTを返すようになりました (GH 15830)。

  • DataFramePanelコンストラクタは、スカラー入力を軸なしで呼び出すと、PandasErrorではなくValueErrorを発生させるようになりました (GH 15541)。

  • DataFramePanelのコンストラクタは、スカラー入力を軸なしで呼び出すと、pandas.core.common.PandasErrorではなくValueErrorを発生させるようになりました。例外PandasErrorも削除されました。(GH 15541)

  • 例外pandas.core.common.AmbiguousIndexErrorは参照されていないため削除されました (GH 15541)。

ライブラリの再編成:プライバシーの変更#

モジュールのプライバシーが変更されました#

以前は公開されていた一部のPython/C/C++/Cython拡張モジュールが移動および/または名前変更されました。これらはすべて公開APIから削除されました。さらに、pandas.corepandas.compat、およびpandas.utilトップレベルモジュールは現在PRIVATEとみなされます。これらのモジュールを参照すると、指示があった場合、非推奨警告が発行されます。(GH 12588)

以前の場所

新しい場所

非推奨

pandas.lib

pandas._libs.lib

X

pandas.tslib

pandas._libs.tslib

X

pandas.computation

pandas.core.computation

X

pandas.msgpack

pandas.io.msgpack

pandas.index

pandas._libs.index

pandas.algos

pandas._libs.algos

pandas.hashtable

pandas._libs.hashtable

pandas.indexes

pandas.core.indexes

pandas.json

pandas._libs.json / pandas.io.json

X

pandas.parser

pandas._libs.parsers

X

pandas.formats

pandas.io.formats

pandas.sparse

pandas.core.sparse

pandas.tools

pandas.core.reshape

X

pandas.types

pandas.core.dtypes

X

pandas.io.sas.saslib

pandas.io.sas._sas

pandas._join

pandas._libs.join

pandas._hash

pandas._libs.hashing

pandas._period

pandas._libs.period

pandas._sparse

pandas._libs.sparse

pandas._testing

pandas._libs.testing

pandas._window

pandas._libs.window

トップレベルの名前空間に直接公開されていないパブリック機能を持ついくつかの新しいサブパッケージが作成されました。pandas.errorspandas.plotting、およびpandas.testing(詳細は後述)。これらは、pandas.api.typesおよびpandas.ioおよびpandas.tseriesサブモジュールの一部の関数とともに、現在のパブリックサブパッケージです。

さらなる変更

  • 関数union_categoricals()は、以前はpandas.types.concatからインポートできましたが、現在はpandas.api.typesからインポートできるようになりました (GH 15998)。

  • 型インポートpandas.tslib.NaTTypeは非推奨となり、type(pandas.NaT)を使用して置き換えることができます (GH 16146)。

  • pandas.tools.hashing内の公開関数は、その場所から非推奨となりましたが、現在はpandas.utilからインポートできるようになりました (GH 16223)。

  • pandas.util内のモジュール: decorators, print_versions, doctools, validators, depr_moduleはプライベートになりました。pandas.util自体で公開されている関数のみが公開されています (GH 16223)。

pandas.errors#

すべてのpandas例外と警告のための標準的な公開モジュールpandas.errorsを追加しています。(GH 14800)。以前は、これらの例外と警告はpandas.core.commonまたはpandas.io.commonからインポートできました。これらの例外と警告は、将来のリリースで*.commonの場所から削除されます。(GH 15541)

以下がこのAPIの一部となりました。

['DtypeWarning',
 'EmptyDataError',
 'OutOfBoundsDatetime',
 'ParserError',
 'ParserWarning',
 'PerformanceWarning',
 'UnsortedIndexError',
 'UnsupportedFunctionCall']

pandas.testing#

公開テスト関数を公開する標準モジュールpandas.testingを追加しています (GH 9895)。これらの関数は、pandasオブジェクトを使用する機能のテストを作成する際に使用できます。

以下のテスト関数がこのAPIの一部となりました。

pandas.plotting#

以前は pandas.tools.plotting またはトップレベルの名前空間にあったプロット機能を持つ、新しい公開モジュール pandas.plotting が追加されました。詳細については、非推奨セクションを参照してください。

その他の開発上の変更点#

  • 開発用の pandas をビルドするには、cython >= 0.23 が必要になりました (GH 14831)

  • 文字エンコーディングの問題を回避するため、cython のバージョン 0.23 以上が必要です (GH 14699)

  • テストフレームワークを pytest を使用するように切り替えました (GH 13097)

  • テストディレクトリのレイアウトが再編成されました (GH 14854, GH 15707)。

非推奨#

.ix の非推奨化#

.ix インデクサーは非推奨となり、より厳密な .iloc および .loc インデクサーが推奨されます。.ix は、ユーザーが何をしたいのかを推測する上で多くのマジックを提供します。より具体的には、.ix はインデックスのデータ型に応じて、位置的 または ラベル によるインデックス付けを決定できます。これにより、長年にわたり多くのユーザーの混乱を招いてきました。完全なインデックス付けのドキュメントはこちらです。 (GH 14218)

推奨されるインデックス付け方法は以下のとおりです。

  • ラベル でインデックス付けしたい場合は .loc

  • 位置的 にインデックス付けしたい場合は .iloc

.ix を使用すると、コードを変換する方法の例へのリンク付きで DeprecationWarning が表示されるようになりましたこちら

In [104]: df = pd.DataFrame({'A': [1, 2, 3],
   .....:                    'B': [4, 5, 6]},
   .....:                   index=list('abc'))
   .....: 

In [105]: df
Out[105]: 
   A  B
a  1  4
b  2  5
c  3  6

[3 rows x 2 columns]

以前の動作では、「A」列のインデックスから0番目と2番目の要素を取得したい場合。

In [3]: df.ix[[0, 2], 'A']
Out[3]:
a    1
c    3
Name: A, dtype: int64

.loc を使用。ここでは、インデックスから適切なインデックスを選択し、ラベル インデックスを使用します。

In [106]: df.loc[df.index[[0, 2]], 'A']
Out[106]: 
a    1
c    3
Name: A, Length: 2, dtype: int64

.iloc を使用。ここでは、「A」列の位置を取得し、位置的 インデックスを使用して要素を選択します。

In [107]: df.iloc[[0, 2], df.columns.get_loc('A')]
Out[107]: 
a    1
c    3
Name: A, Length: 2, dtype: int64

パネルの非推奨化#

Panel は非推奨となり、将来のバージョンで削除されます。3次元データを表現する推奨される方法は、to_frame() を使用した DataFrame 上の MultiIndex、または xarray パッケージを使用することです。pandas はこの変換を自動化する to_xarray() メソッドを提供します (GH 13563)。

In [133]: import pandas._testing as tm

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

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

MultiIndex DataFrame に変換する

In [136]: p.to_frame()
Out[136]:
                     ItemA     ItemB     ItemC
major      minor
2000-01-03 A      0.628776 -1.409432  0.209395
           B      0.988138 -1.347533 -0.896581
           C     -0.938153  1.272395 -0.161137
           D     -0.223019 -0.591863 -1.051539
2000-01-04 A      0.186494  1.422986 -0.592886
           B     -0.072608  0.363565  1.104352
           C     -1.239072 -1.449567  0.889157
           D      2.123692 -0.414505 -0.319561
2000-01-05 A      0.952478 -2.147855 -1.473116
           B     -0.550603 -0.014752 -0.431550
           C      0.139683 -1.195524  0.288377
           D      0.122273 -1.425795 -0.619993

[12 rows x 3 columns]

xarray DataArray に変換する

In [137]: p.to_xarray()
Out[137]:
<xarray.DataArray (items: 3, major_axis: 3, minor_axis: 4)>
array([[[ 0.628776,  0.988138, -0.938153, -0.223019],
        [ 0.186494, -0.072608, -1.239072,  2.123692],
        [ 0.952478, -0.550603,  0.139683,  0.122273]],

       [[-1.409432, -1.347533,  1.272395, -0.591863],
        [ 1.422986,  0.363565, -1.449567, -0.414505],
        [-2.147855, -0.014752, -1.195524, -1.425795]],

       [[ 0.209395, -0.896581, -0.161137, -1.051539],
        [-0.592886,  1.104352,  0.889157, -0.319561],
        [-1.473116, -0.43155 ,  0.288377, -0.619993]]])
Coordinates:
  * items       (items) object 'ItemA' 'ItemB' 'ItemC'
  * major_axis  (major_axis) datetime64[ns] 2000-01-03 2000-01-04 2000-01-05
  * minor_axis  (minor_axis) object 'A' 'B' 'C' 'D'

groupby.agg() を辞書でリネームする場合の非推奨化#

.groupby(..).agg(..).rolling(..).agg(..)、および .resample(..).agg(..) の構文は、スカラー、リスト、および列名をスカラーまたはリストに対応付ける辞書を含む、様々な入力を受け入れることができます。これは、複数の(潜在的に異なる)集計を構築するのに便利な構文を提供します。

しかし、.agg(..) は、結果の列の「名前変更」を可能にする辞書も受け入れることができます。これは、SeriesDataFrame の間で一貫性がなく、複雑で紛らわしい構文です。この「名前変更」機能は非推奨となります。

  • グループ化/ロール化/リサンプリングされた Series に辞書を渡すことは非推奨となります。これにより、結果の集計を rename することができましたが、これは列から集計を受け入れるグループ化された DataFrame に辞書を渡すのとは全く異なる意味を持っていました。

  • 同様に、グループ化/ロール化/リサンプリングされた DataFrame に辞書の辞書を渡すことも非推奨となります。

これは説明のための例です

In [108]: df = pd.DataFrame({'A': [1, 1, 1, 2, 2],
   .....:                    'B': range(5),
   .....:                    'C': range(5)})
   .....: 

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

[5 rows x 3 columns]

異なる列に対して異なる集計を計算するための一般的な便利な構文です。これは自然で便利な構文です。指定された列を取り、関数のリストを適用することで、辞書からリストへの集計を行います。これは列に MultiIndex を返します (これは非推奨ではありません)。

In [110]: df.groupby('A').agg({'B': 'sum', 'C': 'min'})
Out[110]: 
   B  C
A      
1  3  0
2  7  3

[2 rows x 2 columns]

ここでは、最初の非推奨化の例として、グループ化された Series に辞書を渡す場合を示します。これは集計と名前変更の組み合わせです。

In [6]: df.groupby('A').B.agg({'foo': 'count'})
FutureWarning: using a dict on a Series for aggregation
is deprecated and will be removed in a future version

Out[6]:
   foo
A
1    3
2    2

同じ操作を、より慣用的な方法で実現できます。

In [111]: df.groupby('A').B.agg(['count']).rename(columns={'count': 'foo'})
Out[111]: 
   foo
A     
1    3
2    2

[2 rows x 1 columns]

ここでは、2番目の非推奨化の例として、グループ化された DataFrame に辞書の辞書を渡す場合を示します。

In [23]: (df.groupby('A')
    ...:    .agg({'B': {'foo': 'sum'}, 'C': {'bar': 'min'}})
    ...:  )
FutureWarning: using a dict with renaming is deprecated and
will be removed in a future version

Out[23]:
     B   C
   foo bar
A
1   3   0
2   7   3

ほぼ同じことを次のようにして実現できます。

In [112]: (df.groupby('A')
   .....:    .agg({'B': 'sum', 'C': 'min'})
   .....:    .rename(columns={'B': 'foo', 'C': 'bar'})
   .....:  )
   .....: 
Out[112]: 
   foo  bar
A          
1    3    0
2    7    3

[2 rows x 2 columns]

.plotting の非推奨化#

pandas.tools.plotting モジュールは非推奨となり、トップレベルの pandas.plotting モジュールが推奨されます。すべての公開されているプロット関数は pandas.plotting から利用できるようになりました (GH 12548)。

さらに、トップレベルの pandas.scatter_matrix および pandas.plot_params は非推奨です。ユーザーはこれらを pandas.plotting からインポートすることもできます。

以前のスクリプト

pd.tools.plotting.scatter_matrix(df)
pd.scatter_matrix(df)

以下のように変更する必要があります。

pd.plotting.scatter_matrix(df)

その他の非推奨化#

  • SparseArray.to_dense()fill パラメーターは、以前尊重されていなかったため非推奨となりました (GH 14647)

  • SparseSeries.to_dense()sparse_only パラメーターは非推奨となりました (GH 14647)

  • Series.repeat()reps パラメーターは repeats に置き換えられ非推奨となりました (GH 12662)

  • Series コンストラクターと .astype メソッドは、dtype パラメーターに周波数なしのタイムスタンプ dtype (例: np.datetime64) を受け入れることを非推奨としました (GH 15524)

  • Index.repeat() および MultiIndex.repeat()n パラメーターは repeats に置き換えられ非推奨となりました (GH 12662)

  • Categorical.searchsorted()Series.searchsorted()v パラメーターは value に置き換えられ非推奨となりました (GH 12662)

  • TimedeltaIndex.searchsorted(), DatetimeIndex.searchsorted(), および PeriodIndex.searchsorted()key パラメーターは value に置き換えられ非推奨となりました (GH 12662)

  • DataFrame.astype()raise_on_error パラメーターは errors に置き換えられ非推奨となりました (GH 14878)

  • Series.sortlevel および DataFrame.sortlevel は、Series.sort_index および DataFrame.sort_index に置き換えられ非推奨となりました (GH 15099)

  • pandas.tools.merge から concat をインポートすることは、pandas 名前空間からのインポートに置き換えられ非推奨となりました。これは明示的なインポートにのみ影響するはずです (GH 15358)

  • Series/DataFrame/Panel.consolidate() は公開メソッドとして非推奨となりました。 (GH 15483)

  • Series.str.match()as_indexer キーワードは非推奨となりました (無視されるキーワード) (GH 15257)。

  • 以下のトップレベルの pandas 関数は非推奨となり、将来のバージョンで削除されます (GH 13790, GH 15940)

    • pd.pnow()Period.now() に置き換えられました

    • pd.Term はユーザーコードには適用されないため削除されました。代わりに HDFStore で検索する際に where 句でインライン文字列式を使用してください。

    • pd.Expr はユーザーコードには適用されないため削除されました。

    • pd.match() は削除されました。

    • pd.groupby() は、Series/DataFrame で直接 .groupby() メソッドを使用することに置き換えられました。

    • pd.get_store()pd.HDFStore(...) の直接呼び出しに置き換えられました。

  • is_any_int_dtypeis_floating_dtype、および is_sequencepandas.api.types から非推奨となりました (GH 16042)

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

  • pandas.rpy モジュールは削除されました。同様の機能は rpy2 プロジェクトを通じてアクセスできます。詳細については、R インターフェースのドキュメントを参照してください。

  • google-analytics インターフェースを持つ pandas.io.ga モジュールは削除されました (GH 11308)。同様の機能は Google2Pandas パッケージで見つけることができます。

  • pd.to_datetimepd.to_timedeltacoerce パラメーターを errors に置き換え非推奨としました (GH 13602)

  • pandas.stats.fama_macbethpandas.stats.olspandas.stats.plm、および pandas.stats.var、ならびにトップレベルの pandas.fama_macbeth および pandas.ols ルーチンは削除されました。同様の機能は statsmodels パッケージで見つけることができます。 (GH 11898)

  • Series および SparseSeries のエイリアスである TimeSeries および SparseTimeSeries クラスは削除されました (GH 10890, GH 15098)。

  • Series.is_time_seriesSeries.index.is_all_dates に置き換えられ削除されました (GH 15098)

  • 非推奨となった irow, icol, iget, iget_value メソッドは、こちらで説明されているように ilociat に置き換えられ削除されました (GH 10711)。

  • 非推奨となった DataFrame.iterkv()DataFrame.iteritems() に置き換えられ削除されました (GH 10711)

  • Categorical コンストラクターは name パラメーターを削除しました (GH 10632)

  • CategoricalNaN カテゴリのサポートを削除しました (GH 10748)

  • take_last パラメーターは duplicated(), drop_duplicates(), nlargest(), および nsmallest() メソッドから削除されました (GH 10236, GH 10792, GH 10920)

  • SeriesIndex、および DataFramesort および order メソッドを削除しました (GH 10726)

  • pytables の where 句は文字列および式型としてのみ受け入れられ、他のデータ型では受け入れられません (GH 12027)

  • DataFramecombineAdd および combineMult メソッドを、それぞれ add および mul に置き換え削除しました (GH 10735)

パフォーマンス改善#

  • pd.wide_to_long() のパフォーマンスが改善されました (GH 14779)

  • pd.factorize() のパフォーマンスが改善されました。文字列と推測される object dtype の場合、GIL が解放されます (GH 14859, GH 16057)

  • 不規則な DatetimeIndex (または compat_x=True) を持つ時系列プロットのパフォーマンスが改善されました (GH 15073)。

  • groupby().cummin()groupby().cummax() のパフォーマンスが改善されました (GH 15048, GH 15109, GH 15561, GH 15635)

  • MultiIndex を使用したインデックス付けのパフォーマンスが改善され、メモリが削減されました (GH 15245)

  • read_sas() メソッドで、指定された形式なしでバッファオブジェクトを読み込む際、バッファオブジェクトではなくファイルパス文字列が推測されるようになりました。 (GH 14947)

  • カテゴリカルデータに対する .rank() のパフォーマンスが改善されました (GH 15498)

  • .unstack() を使用する際のパフォーマンスが改善されました (GH 15503)

  • category 列でのマージ/結合のパフォーマンスが改善されました (GH 10409)

  • bool 列での drop_duplicates() のパフォーマンスが改善されました (GH 12963)

  • 適用される関数がグループ DataFrame の .name 属性を使用した場合の pd.core.groupby.GroupBy.apply のパフォーマンスが改善されました (GH 15062)。

  • リストまたは配列を使用した iloc インデックス付けのパフォーマンスが改善されました (GH 15504)。

  • 単調なインデックスを持つ Series.sort_index() のパフォーマンスが改善されました (GH 15694)

  • 一部のプラットフォームでのバッファリングされた読み込みで pd.read_csv() のパフォーマンスが改善されました (GH 16039)

バグ修正#

変換#

  • Timestamp.replace のバグで、以前は ValueError が発生していましたが、誤った引数名が与えられた場合に TypeError が発生するようになりました (GH 15240)

  • Timestamp.replace のバグで、長い整数を渡す際の互換性が確保されました (GH 15030)

  • タイムゾーンが指定された場合に、Timestamp が UTC ベースの時刻/日付属性を返すバグ (GH 13303, GH 6538)

  • Timestamp で、構築中にタイムゾーンが誤ってローカライズされるバグ (GH 11481, GH 15777)

  • TimedeltaIndex の加算で、エラーなしでオーバーフローが許容されていたバグ (GH 14816)

  • TimedeltaIndexloc を使用してブールインデックス付けを行うと ValueError が発生するバグ (GH 14946)

  • Timestamp + Timedelta/Offset 演算でのオーバーフローをキャッチする際のバグ (GH 15126)

  • DatetimeIndex.round()Timestamp.round() のバグで、ミリ秒以下で丸める際の浮動小数点精度が不正確だった問題 (GH 14440, GH 15578)

  • astype() のバグで、inf 値が誤って整数に変換されていました。現在では、Series および DataFrame の astype() でエラーが発生するようになりました (GH 14265)

  • 値が decimal.Decimal 型の場合の DataFrame(..).apply(to_numeric) のバグ。 (GH 14827)

  • describe() のバグで、percentiles キーワード引数に中央値を含まない numpy 配列を渡した場合に問題がありました (GH 14908)

  • PeriodIndex コンストラクターをクリーンアップし、浮動小数点数に対してより一貫してエラーを発生させるようにしました (GH 13277)

  • 空の NDFrame オブジェクトで __deepcopy__ を使用する際のバグ (GH 15370)

  • .replace() のバグにより、dtypes が正しくない場合があります。 (GH 12747, GH 15765)

  • 空の置換辞書で失敗する Series.replace および DataFrame.replace のバグ (GH 15289)

  • 数値を文字列に置き換える Series.replace のバグ (GH 15743)

  • NaN 要素と指定された整数 dtype を持つ Index の構築におけるバグ (GH 15187)

  • datetimetz を使用した Series 構築のバグ (GH 14928)

  • Series.dt.round() のバグで、異なる引数を持つ NaT で一貫性のない動作が発生していました (GH 14940)

  • Series コンストラクターで、copy=Truedtype 引数が両方指定された場合のバグ (GH 15125)

  • 空の DataFrame に対する比較メソッド(例:ltgt、…)が定数と比較された場合、不正な dtype の Series が返されるバグ (GH 15077)

  • タイムゾーン対応の datetime を含む混合 dtype の Series.ffill() のバグ。 (GH 14956)

  • DataFrame.fillna() のバグで、fillna 値が dict 型の場合に引数 downcast が無視されていた問題 (GH 15277)

  • .asfreq() のバグで、空の Series の周波数が設定されていなかった問題 (GH 14320)

  • リストのようなものに null と datetime を含む DataFrame 構築のバグ (GH 15869)

  • タイムゾーン対応の datetime を含む DataFrame.fillna() のバグ (GH 15855)

  • is_string_dtypeis_timedelta64_ns_dtype、および is_string_like_dtype のバグで、None が渡されたときにエラーが発生していました (GH 15941)

  • pd.uniqueCategorical に対して ndarray を返し、Categorical を返していなかったバグ (GH 15903)

  • Index.to_series() のバグで、インデックスがコピーされなかったため(後に変更すると元のインデックスも変更される)、問題が発生していました (GH 15949)

  • 長さが1の DataFrame で部分文字列インデックス付けを行う際のバグ (GH 16071)

  • Series 構築のバグで、無効な dtype を渡してもエラーが発生しませんでした。 (GH 15520)

インデックス付け#

  • 反転されたオペランドを持つ Index の累乗演算のバグ (GH 14973)

  • DataFrame.sort_values() のバグで、複数の列でソートする際に、1つの列が int64 型で NaT を含んでいると問題が発生していました (GH 14922)

  • DataFrame.reindex() のバグで、columns を渡すときに method が無視されていた問題 (GH 14992)

  • DataFrame.loc のバグで、MultiIndexSeries インデクサーでインデックス付けする際に問題が発生していました (GH 14730, GH 15424)

  • DataFrame.loc のバグで、MultiIndex を numpy 配列でインデックス付けする際に問題が発生していました (GH 15434)

  • Series.asof のバグで、シリーズがすべて np.nan を含んでいる場合にエラーが発生していました (GH 15713)

  • タイムゾーン対応の列から選択する際の .at のバグ (GH 15822)

  • Series.where()DataFrame.where() のバグで、配列のような条件が拒否されていました (GH 15414)

  • Series.where() のバグで、TZ-aware データが浮動小数点表現に変換されていました (GH 15701)

  • DataFrame のスカラーアクセスで正しい dtype を返さない .loc のバグ (GH 11617)

  • 名前が整数の場合の MultiIndex の出力フォーマットのバグ (GH 12223, GH 15262)

  • Categorical.searchsorted() のバグで、提供されたカテゴリ順ではなくアルファベット順が使用されていました (GH 14522)

  • Series.iloc のバグで、リストのようなインデックス入力の場合に Categorical オブジェクトが返され、本来は Series が期待されていました。 (GH 14580)

  • datetimelike を空のフレームと比較する DataFrame.isin のバグ (GH 15473)

  • .reset_index() のバグで、MultiIndex のすべての NaN レベルが失敗する問題 (GH 6322)

  • .reset_index() のバグで、MultiIndex の列にインデックス名が既に存在する場合にエラーが発生する問題 (GH 16120)

  • タプルを使って MultiIndex を作成する際に、名前のリストを渡さないと ValueError が発生するようになりました (GH 15110)

  • MultiIndex と切り捨てを伴う HTML 表示のバグ (GH 14882)

  • .info() の表示バグで、文字列以外のみを含む MultiIndex の場合、常に修飾子 (+) が表示されていました (GH 15245)

  • pd.concat() のバグで、入力 DataFrameMultiIndex の名前に None が含まれている場合、結果の DataFrameMultiIndex の名前が正しく処理されない問題 (GH 15787)

  • DataFrame.sort_index()Series.sort_index() のバグで、na_positionMultiIndex で機能しない問題 (GH 14784, GH 16604)

  • CategoricalIndex を持つオブジェクトを結合する際の pd.concat() のバグ (GH 16111)

  • スカラーと CategoricalIndex を用いたインデックス付けのバグ (GH 16123)

IO#

  • pd.to_numeric() のバグで、float と符号なし整数要素が誤ってキャストされていた問題 (GH 14941, GH 15005)

  • pd.read_fwf() のバグで、列幅推測時に skiprows パラメータが尊重されていなかった問題 (GH 11256)

  • pd.read_csv() のバグで、dialect パラメータが処理前に検証されていなかった問題 (GH 14898)

  • pd.read_csv() のバグで、usecols を使用した場合に欠損データが誤って処理されていた問題 (GH 6710)

  • pd.read_csv() のバグで、多数の列を持つ行の後に少数の列を持つ行が続くファイルがクラッシュを引き起こす問題 (GH 14125)

  • pd.read_csv() の C エンジンでのバグで、parse_datesusecols のインデックス付けが誤っていた問題 (GH 14792)

  • pd.read_csv() のバグで、複数行ヘッダーが指定された場合に parse_dates が正しく機能しなかった問題 (GH 15376)

  • pd.read_csv() のバグで、float_precision='round_trip' を指定すると、テキストエントリがパースされたときにセグメンテーション違反が発生する問題 (GH 15140)

  • pd.read_csv() のバグで、インデックスが指定され、null 値として何も指定されていない場合に問題がありました (GH 15835)

  • pd.read_csv() のバグで、特定の無効なファイルオブジェクトが Python インタープリターをクラッシュさせる問題 (GH 15337)

  • pd.read_csv() のバグで、nrows および chunksize に無効な値が許容されていた問題 (GH 15767)

  • pd.read_csv() の Python エンジンでのバグで、パースエラーが発生した際に役立たないエラーメッセージが表示されていた問題 (GH 15910)

  • pd.read_csv() のバグで、skipfooter パラメーターが適切に検証されていなかった問題 (GH 15925)

  • pd.to_csv() のバグで、タイムスタンプインデックスが書き込まれる際に数値オーバーフローが発生していました (GH 15982)

  • pd.util.hashing.hash_pandas_object() のバグで、カテゴリカルのハッシュ化が、値だけでなくカテゴリの順序にも依存していた問題 (GH 15143)

  • .to_json() のバグで、lines=True かつ内容(キーまたは値)にエスケープ文字が含まれている場合に問題が発生していました (GH 15096)

  • .to_json() のバグで、シングルバイトの ASCII 文字が4バイトの Unicode に展開されていました (GH 15344)

  • .to_json() の C エンジンでのバグで、分数部が奇数で差が正確に 0.5 の場合にロールオーバーが正しく処理されていなかった問題 (GH 15716, GH 15864)

  • Python 2 の pd.read_json() のバグで、lines=True かつ内容に非 ASCII Unicode 文字が含まれている場合に問題が発生していました (GH 15132)

  • pd.read_msgpack() のバグで、Series カテゴリカルが誤って処理されていた問題 (GH 14901)

  • pd.read_msgpack() のバグで、CategoricalIndex 型のインデックスを持つデータフレームをロードできなかった問題 (GH 15487)

  • pd.read_msgpack() のバグで、CategoricalIndex を逆シリアル化する際に問題がありました (GH 15487)

  • タイムゾーンを持つ DatetimeIndex を変換する際の DataFrame.to_records() のバグ (GH 13937)

  • 列名にユニコード文字が含まれている場合に失敗する DataFrame.to_records() のバグ (GH 11879)

  • 数値インデックス名を持つ DataFrame を書き込む際の .to_sql() のバグ (GH 15404)。

  • DataFrame.to_html() のバグで、index=Falsemax_rowsIndexError を発生させていた問題 (GH 14998)

  • pd.read_hdf() のバグで、日付以外の列を持つ where パラメーターに Timestamp を渡す際に問題が発生していました (GH 15492)

  • DataFrame.to_stata() および StataWriter のバグで、一部のロケールで誤った形式のファイルが生成される問題 (GH 13856)

  • StataReader および StataWriter のバグで、無効なエンコーディングが許可されていた問題 (GH 15723)

  • Series の repr 形式のバグで、出力が切り捨てられた場合に長さが表示されなかった問題 (GH 15962)。

プロット#

  • DataFrame.hist のバグで、plt.tight_layoutAttributeError を発生させていました (matplotlib >= 2.0.1 を使用) (GH 9351)

  • DataFrame.boxplot のバグで、fontsize が両軸の目盛りラベルに適用されていなかった問題 (GH 15108)

  • matplotlib に登録されている pandas の日付と時刻のコンバーターが複数の次元を処理しないバグ (GH 16026)

  • pd.scatter_matrix() のバグで、color または c のいずれかを受け入れたが、両方は受け入れなかった問題 (GH 14855)

GroupBy/resample/rolling#

  • .groupby(..).resample() のバグで、on= kwarg を渡した場合に問題が発生していました。 (GH 15021)

  • Groupby.* 関数に対して __name__ および __qualname__ が適切に設定されるようになりました (GH 14620)

  • カテゴリカルグルーパで GroupBy.get_group() が失敗するバグ (GH 15155)

  • .groupby(...).rolling(...) のバグで、on が指定され、DatetimeIndex が使用されている場合に問題が発生していました (GH 15130, GH 13966)

  • numeric_only=False を渡したときに timedelta64 を使用した groupby 操作のバグ (GH 5724)

  • groupby.apply() のバグで、すべての値が数値でない場合でも object dtypes を数値型に強制変換していました (GH 14423, GH 15421, GH 15670)

  • resample のバグで、時系列をリサンプリングする際に非文字列の loffset 引数が適用されなかった問題 (GH 13218)

  • DataFrame.groupby().describe() のバグで、タプルを含む Index でグループ化する際に問題が発生していました (GH 14848)

  • groupby().nunique() のバグで、datetimelike グルーパを使用した場合にビンカウントが誤っていた問題 (GH 13453)

  • groupby.transform() のバグで、結果の dtype を元の型に強制変換していました (GH 10972, GH 11444)

  • groupby.agg() のバグで、datetime のタイムゾーンを誤ってローカライズしていました (GH 15426, GH 10668, GH 13046)

  • .rolling/expanding() 関数のバグで、count()np.Inf をカウントせず、object dtypes を処理していなかった問題 (GH 12541)

  • .rolling() のバグで、pd.Timedelta または datetime.timedeltawindow 引数として受け入れられなかった問題 (GH 15440)

  • Rolling.quantile 関数のバグで、範囲 [0, 1] 外の分位値で呼び出されたときにセグメンテーション違反が発生していました (GH 15463)

  • 重複する列名が存在する場合の DataFrame.resample().median() のバグ (GH 14233)

スパース#

  • 長さ1のリストを持つ単一レベルでの SparseSeries.reindex のバグ (GH 15447)

  • SparseDataFrame の repr 形式のバグで、シリーズの1つ (のコピー) に値が設定された後に問題が発生していました (GH 15488)

  • リストが dtype に強制変換されない SparseDataFrame 構築のバグ (GH 15682)

  • スパース配列のインデックス付けのバグで、インデックスが検証されていなかった問題 (GH 15863)

再整形#

  • pd.merge_asof() のバグで、複数の by が指定された場合に left_index または right_index が失敗する問題 (GH 15676)

  • pd.merge_asof() のバグで、tolerance が指定された場合に left_indexright_index が同時に失敗する問題 (GH 15135)

  • DataFrame.pivot_table() のバグで、dropna=True が、列が category dtype の場合にすべての NaN 列を削除しなかった問題 (GH 15193)

  • pd.melt() のバグで、value_vars にタプル値を渡すと TypeError が発生しました (GH 15348)

  • pd.pivot_table() のバグで、values 引数が列にない場合にエラーが発生しなかった問題 (GH 14938)

  • pd.concat() のバグで、join='inner' で空のデータフレームと連結した場合に誤って処理されていた問題 (GH 15328)

  • インデックス結合時に DataFrame.join および pd.mergesort=True のバグ (GH 15582)

  • DataFrame.nsmallestDataFrame.nlargest のバグで、同一の値が重複行を引き起こしていました (GH 15297)

  • pandas.pivot_table() のバグで、margins キーワードに Unicode 入力を渡すと UnicodeError が誤って発生していました (GH 13292)

数値#

  • .rank() のバグで、順序付きカテゴリが誤ってランク付けされていました (GH 15420)

  • .corr().cov() のバグで、列とインデックスが同じオブジェクトだった場合の問題 (GH 14617)

  • .mode() のバグで、単一の値しか存在しない場合でも mode が返されなかった問題 (GH 15714)

  • すべて 0 の配列で単一のビンを持つ pd.cut() のバグ (GH 15428)

  • 単一の分位点と同一の値を持つ配列を持つ pd.qcut() のバグ (GH 15431)

  • pandas.tools.utils.cartesian_product() のバグで、大きな入力が Windows でオーバーフローを引き起こす可能性がありました (GH 15265)

  • .eval() のバグで、複数行の eval が最初の行にローカル変数がない場合に失敗していました (GH 15342)

その他#

  • .interpolate() のテスト用 SciPy 0.19.0 との互換性 (GH 15662)

  • 32 ビットプラットフォーム向けの .qcut/cut との互換性。bins は int64 dtype になります (GH 14866)

  • QtApplication がすでに存在する場合の Qt との相互作用におけるバグ (GH 14372)

  • Python GIL の誤用によるデッドロックを軽減するため、import pandas 中の np.finfo() の使用を回避する変更を削除 (GH 14641)

貢献者#

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

  • Adam J. Stewart +

  • Adrian +

  • Ajay Saxena

  • Akash Tandon +

  • Albert Villanova del Moral +

  • Aleksey Bilogur +

  • Alexis Mignon +

  • Amol Kahat +

  • Andreas Winkler +

  • Andrew Kittredge +

  • Anthonios Partheniou

  • Arco Bast +

  • Ashish Singal +

  • Baurzhan Muftakhidinov +

  • Ben Kandel

  • Ben Thayer +

  • Ben Welsh +

  • Bill Chambers +

  • Brandon M. Burroughs

  • Brian +

  • Brian McFee +

  • Carlos Souza +

  • Chris

  • Chris Ham

  • Chris Warth

  • Christoph Gohlke

  • Christoph Paulik +

  • Christopher C. Aycock

  • Clemens Brunner +

  • D.S. McNeil +

  • DaanVanHauwermeiren +

  • Daniel Himmelstein

  • Dave Willmer

  • David Cook +

  • David Gwynne +

  • David Hoffman +

  • David Krych

  • Diego Fernandez +

  • Dimitris Spathis +

  • Dmitry L +

  • Dody Suria Wijaya +

  • Dominik Stanczak +

  • Dr-Irv

  • Dr. Irv +

  • Elliott Sales de Andrade +

  • Ennemoser Christoph +

  • Francesc Alted +

  • Fumito Hamamura +

  • Giacomo Ferroni

  • Graham R. Jeffries +

  • Greg Williams +

  • Guilherme Beltramini +

  • Guilherme Samora +

  • Hao Wu +

  • Harshit Patni +

  • Ilya V. Schurov +

  • Iván Vallés Pérez

  • Jackie Leng +

  • Jaehoon Hwang +

  • James Draper +

  • James Goppert +

  • James McBride +

  • James Santucci +

  • ヤン・シュルツ

  • Jeff Carey

  • ジェフ・リーバック

  • JennaVergeynst +

  • Jim +

  • Jim Crist

  • Joe Jevnik

  • Joel Nothman +

  • John +

  • John Tucker +

  • John W. O’Brien

  • John Zwinck

  • Jon M. Mease

  • Jon Mease

  • Jonathan Whitmore +

  • Jonathan de Bruin +

  • Joost Kranendonk +

  • Joris Van den Bossche

  • Joshua Bradt +

  • Julian Santander

  • Julien Marrec +

  • Jun Kim +

  • Justin Solinsky +

  • Kacawi +

  • Kamal Kamalaldin +

  • カービー・シェデン

  • Kernc

  • Keshav Ramaswamy

  • ケビン・シェパード

  • Kyle Kelley

  • Larry Ren

  • Leon Yin +

  • Line Pedersen +

  • Lorenzo Cestaro +

  • Luca Scarabello

  • Lukasz +

  • Mahmoud Lababidi

  • Mark Mandel +

  • Matt Roeschke

  • Matthew Brett

  • Matthew Roeschke +

  • Matti Picus

  • Maximilian Roos

  • Michael Charlton +

  • Michael Felt

  • Michael Lamparski +

  • Michiel Stock +

  • Mikolaj Chwalisz +

  • Min RK

  • Miroslav Šedivý +

  • Mykola Golubyev

  • Nate Yoder

  • Nathalie Rud +

  • Nicholas Ver Halen

  • Nick Chmura +

  • Nolan Nichols +

  • Pankaj Pandey +

  • Pawel Kordek

  • Pete Huang +

  • Peter +

  • Peter Csizsek +

  • Petio Petrov +

  • Phil Ruffwind +

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

  • Piotr Chromiec

  • Prasanjit Prakash +

  • Rob Forgione +

  • Robert Bradshaw

  • Robin +

  • Rodolfo Fernandez

  • ロジャー・トーマス

  • Rouz Azari +

  • Sahil Dua

  • Sam Foo +

  • Sami Salonen +

  • Sarah Bird +

  • Sarma Tangirala +

  • Scott Sanderson

  • Sebastian Bank

  • Sebastian Gsänger +

  • Shawn Heide

  • Shyam Saladi +

  • Sinhrks

  • Stephen Rauch +

  • Sébastien de Menten +

  • Tara Adiseshan

  • Thiago Serafim

  • Thoralf Gutierrez +

  • Thrasibule +

  • Tobias Gustafsson +

  • Tom Augspurger

  • Tong SHEN +

  • Tong Shen +

  • TrigonaMinima +

  • Uwe +

  • ウェス・ターナー

  • Wiktor Tomczak +

  • WillAyd

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

  • Yimeng Zhang +

  • abaldenko +

  • adrian-stepien +

  • alexandercbooth +

  • atbd +

  • bastewart +

  • bmagnusson +

  • carlosdanielcsantos +

  • chaimdemulder +

  • クリス・B1

  • dickreuter +

  • discort +

  • dr-leo +

  • dubourg

  • dwkenefick +

  • funnycrab +

  • ジーエフヤング

  • goldenbull +

  • hesham.shabana@hotmail.com

  • jojomdt +

  • linebp +

  • manu +

  • manuels +

  • mattip +

  • maxalbert +

  • mcocdawc +

  • nuffe +

  • paul-mannino

  • pbreach +

  • sakkemo +

  • scls19fr

  • sinhrks

  • stijnvanhoey +

  • the-nose-knows +

  • themrmax +

  • tomrod +

  • tzinckgraf

  • wandersoncferreira

  • watercrossing +

  • wcwagner

  • xgdgsc +

  • yui-knk