バージョン 0.11.0 (2013年4月22日)#
これは 0.10.1 からのメジャーリリースで、多くの新機能と機能強化に加え、多数のバグ修正が含まれています。データの選択メソッドにはかなりの追加があり、Dtype のサポートも本格的になりました。また、長年 pandas を使用しているユーザーは注意すべきいくつかの重要な API 変更点もあります。
ドキュメントに新しいセクション「10 Minutes to Pandas」が追加されました。主に新規ユーザー向けです。
ドキュメントに新しいセクション「Cookbook」が追加されました。これは pandas の便利なレシピ集です(コントリビューションも歓迎します!)。
いくつかのライブラリが推奨依存関係になりました。
選択肢#
0.11.0 より、オブジェクト選択に、より明示的な位置ベースのインデックス作成をサポートするためのユーザーからの要望による追加がいくつかありました。pandas は現在、3種類の多軸インデックス作成をサポートしています。
.locは厳密にラベルベースであり、項目が見つからない場合はKeyErrorを発生させます。許容される入力は次のとおりです。単一のラベル。例:
5または'a'。(注:5はインデックスの*ラベル*として解釈されます。この使用方法はインデックスに沿った整数位置では**ありません**)ラベルのリストまたは配列
['a', 'b', 'c']ラベル付きスライスオブジェクト
'a':'f'。(注: 通常のPythonスライスとは異なり、開始と終了の**両方**が含まれます!)ブール配列
詳細はラベルによる選択をご覧ください。
.ilocは厳密に整数位置ベース(軸の0からlength-1まで)であり、要求されたインデックスが範囲外の場合IndexErrorを発生させます。許容される入力は次のとおりです。整数。例:
5整数のリストまたは配列
[4, 3, 0]整数付きスライスオブジェクト
1:7ブール配列
詳細は位置による選択をご覧ください。
.ixは、整数とラベルに基づいた混合アクセスをサポートします。主にラベルベースですが、整数位置アクセスにフォールバックします。.ixは最も汎用的で、.locおよび.ilocへのあらゆる入力、さらに浮動小数点ラベルスキームもサポートします。.ixは、位置ベースとラベルベースの混合階層インデックスを扱う場合に特に役立ちます。.ixで整数スライスを使用すると、スライスが位置ベースとして解釈されるかラベルベースとして解釈されるかによって動作が異なるため、通常は.ilocまたは.locを明示的に使用することをお勧めします。詳細は高度なインデックス作成および高度な階層をご覧ください。
選択の非推奨#
バージョン0.11.0以降、以下のメソッドは将来のバージョンで非推奨**になる可能性があります**。
irowicoliget_value
代替については、「位置による選択」のセクションを参照してください。
Dtype#
数値型dtypeはDataFrame内で伝播し、共存できます。dtypeが渡された場合(dtype キーワードを介して直接、渡された ndarray、または渡された Series を介して)、DataFrame操作で保持されます。さらに、異なる数値型dtypeは結合**されません**。以下の例でその雰囲気を掴めます。
In [1]: df1 = pd.DataFrame(np.random.randn(8, 1), columns=['A'], dtype='float32')
In [2]: df1
Out[2]:
A
0 0.469112
1 -0.282863
2 -1.509058
3 -1.135632
4 1.212112
5 -0.173215
6 0.119209
7 -1.044236
In [3]: df1.dtypes
Out[3]:
A float32
dtype: object
In [4]: df2 = pd.DataFrame({'A': pd.Series(np.random.randn(8), dtype='float16'),
...: 'B': pd.Series(np.random.randn(8)),
...: 'C': pd.Series(range(8), dtype='uint8')})
...:
In [5]: df2
Out[5]:
A B C
0 -0.861816 -0.424972 0
1 -2.105469 0.567020 1
2 -0.494873 0.276232 2
3 1.072266 -1.087401 3
4 0.721680 -0.673690 4
5 -0.706543 0.113648 5
6 -1.040039 -1.478427 6
7 0.271973 0.524988 7
In [6]: df2.dtypes
Out[6]:
A float16
B float64
C uint8
dtype: object
# here you get some upcasting
In [7]: df3 = df1.reindex_like(df2).fillna(value=0.0) + df2
In [8]: df3
Out[8]:
A B C
0 -0.392704 -0.424972 0.0
1 -2.388332 0.567020 1.0
2 -2.003932 0.276232 2.0
3 -0.063367 -1.087401 3.0
4 1.933792 -0.673690 4.0
5 -0.879758 0.113648 5.0
6 -0.920830 -1.478427 6.0
7 -0.772263 0.524988 7.0
In [9]: df3.dtypes
Out[9]:
A float32
B float64
C float64
dtype: object
Dtype変換#
これは下位互換性のある共通分母のアップキャスティングであり、すべての型に対応できるdtypeを取得します。
In [10]: df3.values.dtype
Out[10]: dtype('float64')
変換
In [11]: df3.astype('float32').dtypes
Out[11]:
A float32
B float32
C float32
dtype: object
混合変換
In [12]: df3['D'] = '1.'
In [13]: df3['E'] = '1'
In [14]: df3.convert_objects(convert_numeric=True).dtypes
Out[14]:
A float32
B float64
C float64
D float64
E int64
dtype: object
# same, but specific dtype conversion
In [15]: df3['D'] = df3['D'].astype('float16')
In [16]: df3['E'] = df3['E'].astype('int32')
In [17]: df3.dtypes
Out[17]:
A float32
B float64
C float64
D float16
E int32
dtype: object
日付の強制変換(および日付形式でない場合の NaT 設定)
In [18]: import datetime
In [19]: s = pd.Series([datetime.datetime(2001, 1, 1, 0, 0), 'foo', 1.0, 1,
....: pd.Timestamp('20010104'), '20010105'], dtype='O')
....:
In [20]: s.convert_objects(convert_dates='coerce')
Out[20]:
0 2001-01-01
1 NaT
2 NaT
3 NaT
4 2001-01-04
5 2001-01-05
dtype: datetime64[ns]
Dtypeの落とし穴#
プラットフォームの落とし穴
0.11.0 以降、DataFrame/Series の構築では、*プラットフォームに関わらず*、デフォルトの dtype として int64 および float64 が使用されます。これは以前のバージョンの pandas とは明白な変更ではありません。ただし、dtype を指定した場合は、それらが尊重されます (GH 2837)。
以下のすべては int64 dtypes になります。
In [21]: pd.DataFrame([1, 2], columns=['a']).dtypes
Out[21]:
a int64
dtype: object
In [22]: pd.DataFrame({'a': [1, 2]}).dtypes
Out[22]:
a int64
dtype: object
In [23]: pd.DataFrame({'a': 1}, index=range(2)).dtypes
Out[23]:
a int64
dtype: object
DataFrame(np.array([1,2])) は32ビットプラットフォームでは**必ず**int32 dtypeになりますのでご注意ください!
アップキャスティングの落とし穴
整数型データに対するインデックス操作は、データを簡単にアップキャストする可能性があります。nan が導入されない場合、入力データのdtypeは保持されます。
In [24]: dfi = df3.astype('int32')
In [25]: dfi['D'] = dfi['D'].astype('int64')
In [26]: dfi
Out[26]:
A B C D E
0 0 0 0 1 1
1 -2 0 1 1 1
2 -2 0 2 1 1
3 0 -1 3 1 1
4 1 0 4 1 1
5 0 0 5 1 1
6 0 -1 6 1 1
7 0 0 7 1 1
In [27]: dfi.dtypes
Out[27]:
A int32
B int32
C int32
D int64
E int32
dtype: object
In [28]: casted = dfi[dfi > 0]
In [29]: casted
Out[29]:
A B C D E
0 NaN NaN NaN 1 1
1 NaN NaN 1.0 1 1
2 NaN NaN 2.0 1 1
3 NaN NaN 3.0 1 1
4 1.0 NaN 4.0 1 1
5 NaN NaN 5.0 1 1
6 NaN NaN 6.0 1 1
7 NaN NaN 7.0 1 1
In [30]: casted.dtypes
Out[30]:
A float64
B float64
C float64
D int64
E int32
dtype: object
float dtypesは変更されません。
In [31]: df4 = df3.copy()
In [32]: df4['A'] = df4['A'].astype('float32')
In [33]: df4.dtypes
Out[33]:
A float32
B float64
C float64
D float16
E int32
dtype: object
In [34]: casted = df4[df4 > 0]
In [35]: casted
Out[35]:
A B C D E
0 NaN NaN NaN 1.0 1
1 NaN 0.567020 1.0 1.0 1
2 NaN 0.276232 2.0 1.0 1
3 NaN NaN 3.0 1.0 1
4 1.933792 NaN 4.0 1.0 1
5 NaN 0.113648 5.0 1.0 1
6 NaN NaN 6.0 1.0 1
7 NaN 0.524988 7.0 1.0 1
In [36]: casted.dtypes
Out[36]:
A float32
B float64
C float64
D float16
E int32
dtype: object
Datetime変換#
DataFrame (または Series) の Datetime64[ns] 列では、従来の NaT (not-a-time) に加えて、np.nan を nan 値として使用できます。これにより、一般的な方法で nan を便利に設定できます。さらに、datetimelike オブジェクトが渡された場合、デフォルトで datetime64[ns] 列が作成されます (*この変更は 0.10.1 で導入されました*) (GH 2809, GH 2810)
In [12]: df = pd.DataFrame(np.random.randn(6, 2), pd.date_range('20010102', periods=6),
....: columns=['A', ' B'])
....:
In [13]: df['timestamp'] = pd.Timestamp('20010103')
In [14]: df
Out[14]:
A B timestamp
2001-01-02 0.404705 0.577046 2001-01-03
2001-01-03 -1.715002 -1.039268 2001-01-03
2001-01-04 -0.370647 -1.157892 2001-01-03
2001-01-05 -1.344312 0.844885 2001-01-03
2001-01-06 1.075770 -0.109050 2001-01-03
2001-01-07 1.643563 -1.469388 2001-01-03
# datetime64[ns] out of the box
In [15]: df.dtypes.value_counts()
Out[15]:
float64 2
datetime64[s] 1
Name: count, dtype: int64
# use the traditional nan, which is mapped to NaT internally
In [16]: df.loc[df.index[2:4], ['A', 'timestamp']] = np.nan
In [17]: df
Out[17]:
A B timestamp
2001-01-02 0.404705 0.577046 2001-01-03
2001-01-03 -1.715002 -1.039268 2001-01-03
2001-01-04 NaN -1.157892 NaT
2001-01-05 NaN 0.844885 NaT
2001-01-06 1.075770 -0.109050 2001-01-03
2001-01-07 1.643563 -1.469388 2001-01-03
datetime64[ns] を object に astype 変換すると、NaT は暗黙的に np.nan に変換されます。
In [18]: import datetime
In [19]: s = pd.Series([datetime.datetime(2001, 1, 2, 0, 0) for i in range(3)])
In [20]: s.dtype
Out[20]: dtype('<M8[ns]')
In [21]: s[1] = np.nan
In [22]: s
Out[22]:
0 2001-01-02
1 NaT
2 2001-01-02
dtype: datetime64[ns]
In [23]: s.dtype
Out[23]: dtype('<M8[ns]')
In [24]: s = s.astype('O')
In [25]: s
Out[25]:
0 2001-01-02 00:00:00
1 NaT
2 2001-01-02 00:00:00
dtype: object
In [26]: s.dtype
Out[26]: dtype('O')
APIの変更点#
インデクサーの作成を容易にするために、インデックスに
to_series()メソッドが追加されました (GH 3275)。
HDFストア
テーブルから単一の列を Series として選択するメソッド
select_columnを追加しました。
uniqueメソッドは非推奨になりました。select_column(key,column).unique()で置き換えることができます。
appendのmin_itemsizeパラメーターは、渡されたキーに対してdata_columnsを自動的に作成するようになりました。
機能強化#
df.to_csv() のパフォーマンスが、場合によっては最大10倍向上しました。 (GH 3059)
Numexpr は現在、特定の種類の数値およびブール演算を高速化するための推奨依存関係です。
Bottleneck は現在、特定の種類の
nan演算を高速化するための推奨依存関係です。
HDFストア
read_csv/to_csvと同様のread_hdf/to_hdfAPI をサポートします。In [27]: df = pd.DataFrame({'A': range(5), 'B': range(5)}) In [28]: df.to_hdf('store.h5', key='table', append=True) In [29]: pd.read_hdf('store.h5', 'table', where=['index > 2']) Out[29]: A B 3 3 3 4 4 4ストアからの
getへのドット属性アクセスを提供します。例:store.df == store['df']
selectおよびselect_as_multipleでのイテレーションをサポートするために、新しいキーワードiterator=booleanおよびchunksize=number_in_a_chunkが提供されています (GH 3076)。*順序付けられていない*時系列からタイムスタンプを選択できるようになりました。これは*順序付けられた*時系列と同様です (GH 2437)。
日時のようなインデックスを持つ DataFrame から文字列で選択できるようになりました。これは Series と同様です (GH 3070)。
In [30]: idx = pd.date_range("2001-10-1", periods=5, freq='M') In [31]: ts = pd.Series(np.random.rand(len(idx)), index=idx) In [32]: ts['2001'] Out[32]: 2001-10-31 0.117967 2001-11-30 0.702184 2001-12-31 0.414034 Freq: M, dtype: float64 In [33]: df = pd.DataFrame({'A': ts}) In [34]: df['2001'] Out[34]: A 2001-10-31 0.117967 2001-11-30 0.702184 2001-12-31 0.414034
Squeezeはオブジェクトから長さ1の次元を削除する可能性があります。>>> p = pd.Panel(np.random.randn(3, 4, 4), items=['ItemA', 'ItemB', 'ItemC'], ... major_axis=pd.date_range('20010102', periods=4), ... minor_axis=['A', 'B', 'C', 'D']) >>> p <class 'pandas.core.panel.Panel'> Dimensions: 3 (items) x 4 (major_axis) x 4 (minor_axis) Items axis: ItemA to ItemC Major_axis axis: 2001-01-02 00:00:00 to 2001-01-05 00:00:00 Minor_axis axis: A to D >>> p.reindex(items=['ItemA']).squeeze() A B C D 2001-01-02 0.926089 -2.026458 0.501277 -0.204683 2001-01-03 -0.076524 1.081161 1.141361 0.479243 2001-01-04 0.641817 -0.185352 1.824568 0.809152 2001-01-05 0.575237 0.669934 1.398014 -0.399338 >>> p.reindex(items=['ItemA'], minor=['B']).squeeze() 2001-01-02 -2.026458 2001-01-03 1.081161 2001-01-04 -0.185352 2001-01-05 0.669934 Freq: D, Name: B, dtype: float64
pd.io.data.Options内で、
期限切れ後に現在の月のデータを取得しようとした際のバグを修正。
BeautifulSoup の代わりに lxml を使用して html をスクレイピングするようになりました (lxml の方が高速でした)。
コールとプットの新しいインスタンス変数は、それらを作成するメソッドが呼び出されたときに自動的に作成されます。これは現在の月に対して機能し、インスタンス変数は単に
callsとputsです。将来の期限切れ月に対しても機能し、インスタンス変数をcallsMMYYまたはputsMMYYとして保存します。ここでMMYYはそれぞれオプションの満期月と年です。
Options.get_near_stock_priceは、関連するオプションデータを取得する月をユーザーが指定できるようになりました。
Options.get_forward_dataには、オプションのキーワード引数nearとabove_belowが追加されました。これにより、ユーザーは現在の株価に近いオプションの将来のデータのみを返すかどうかを指定できます。これは、Options.get_xxx_data()の代わりにOptions.get_near_stock_priceからデータを取得するだけです (GH 2758)。時系列プロットにカーソル座標情報が表示されるようになりました。
シーケンスをpprintする際に、シーケンスごとに表示される要素数を制御するオプション
display.max_seq_itemsを追加しました。( GH 2979)小さい数値の表示を制御するオプション
display.chop_thresholdを追加しました。( GH 2739)100万行を超えるフレームについて verbose_info が計算されるのを防ぐため、オプション
display.max_info_rowsを追加しました (設定可能)。(GH 2807, GH 2918)value_counts() が、正規化されたヒストグラムのための "normalize" 引数を受け入れるようになりました。(GH 2710)。
DataFrame.from_records は、dictだけでなく collections.Mapping ABC の任意のインスタンスを受け入れるようになりました。
プロットのより洗練された視覚スタイルを提供するオプション
display.mpl_styleを追加しました。https://gist.github.com/huyng/816622 に基づいています (GH 3075)。数値演算において、ブール値を整数(値 1 および 0)として扱います。( GH 2641)
to_html() は、予約済みのHTML文字エスケープを制御するためのオプションの "escape" 引数を受け入れるようになりました(デフォルトで有効)。
<および>に加えて&もエスケープされます。(GH 2919)
完全なリストについては、GitHub の完全なリリースノートまたはイシュートラッカーを参照してください。
貢献者#
今回のリリースには合計50人がパッチを寄稿しました。名前に「+」が付いている人は初めてパッチを寄稿した人です。
アダム・グリーンホール +
アルバロ・テヘロ=カンテロ +
アンディ・ヘイデン
ブラッド・バーン +
Chang She
チャップマン・シウ +
クリス・ウィザース +
クリスチャン・ガイアー +
クリストファー・ウィーラン
ダミアン・ガラード
Dan Birken
ダン・デイヴィソン +
Dieter Vandenbussche
ドラゼン・ルチャニン +
ドラジェン・ルチャニン +
Garrett Drapala
イリア・ポロシュキン +
ジェームズ・キャスボン +
ジェフ・リーバック
ジェレミー・ワーグナー +
ジョナサン・チェンバース +
K.-Michael Aye
カーメル・アリソン +
ロイク・エステーブ +
ニコラス・E・ハレッキー +
ピーター・プレッテンホーファー +
フィリップ・クラウド +
ロバート・ギーゼケ +
スキッパー・シーボールド
スペンサー・ライオン
ステファン・リン +
ティエリー・モワサン +
Thomas Kluyver
ティム・アキンボ +
ヴィータウタス・ヤンチャウスカス
ヴィータウタス・ヤンチャウスカス +
Wes McKinney
ウィル・ファーナス +
Wouter Overmeire
アノムレイク +
デイビッドジェームスハンフリーズ +
デンゲマン +
ダイターV77 +
jreback
レクシュアル +
ステファンWリン +
タウク +
ヴィタス +
ウェイティングクオ +
y-p