バージョン 0.10.0 (2012年12月17日)#
これは0.9.1からのメジャーリリースで、多数のバグ修正に加え、多くの新機能と機能強化が含まれています。また、長年pandasを使用しているユーザーは特に注意すべき重要なAPI変更もいくつかあります。
ファイル解析の新機能#
区切りファイル解析エンジン(read_csvおよびread_tableの中核)はゼロから書き直され、解析中のメモリ使用量を大幅に削減し、ほとんどのユースケースで40%以上高速化されました(場合によってはさらに高速)。
他にも多くの新機能があります
encodingオプションによるUnicode処理の大幅な改善。列のフィルタリング (
usecols)データ型指定 (
dtype引数)True/Falseとして認識される文字列を指定する機能
NumPyレコード配列を生成する機能 (
as_recarray)高性能な
delim_whitespaceオプション小数点形式(例:ヨーロッパ形式)の指定
CSV方言オプションの簡素化:
escapechar,lineterminator,quotecharなど現場で観察された多くの例外的な種類のファイルをより堅牢に処理
APIの変更点#
DataFrameのBINOP TimeSeries特殊ケースの動作を非推奨化
DataFrameとSeries間の二項演算のデフォルトの動作は、常にDataFrameの列に沿って位置合わせし、行にブロードキャストすることでしたが、DataFrameが時系列を含む特殊なケース**を除いて**そうでした。各二項演算子には、ブロードキャスト方法を指定できるメソッドが追加されたため、この特殊なケースは段階的に廃止されます(Pythonの禅:*特殊なケースはルールを破るほど特殊ではない*)。私が話しているのは次のことです。
In [1]: import pandas as pd
In [2]: df = pd.DataFrame(np.random.randn(6, 4), index=pd.date_range("1/1/2000", periods=6))
In [3]: df
Out[3]:
0 1 2 3
2000-01-01 0.469112 -0.282863 -1.509059 -1.135632
2000-01-02 1.212112 -0.173215 0.119209 -1.044236
2000-01-03 -0.861849 -2.104569 -0.494929 1.071804
2000-01-04 0.721555 -0.706771 -1.039575 0.271860
2000-01-05 -0.424972 0.567020 0.276232 -1.087401
2000-01-06 -0.673690 0.113648 -1.478427 0.524988
# deprecated now
In [4]: df - df[0]
Out[4]:
0 1 ... 2000-01-05 00:00:00 2000-01-06 00:00:00
2000-01-01 NaN NaN ... NaN NaN
2000-01-02 NaN NaN ... NaN NaN
2000-01-03 NaN NaN ... NaN NaN
2000-01-04 NaN NaN ... NaN NaN
2000-01-05 NaN NaN ... NaN NaN
2000-01-06 NaN NaN ... NaN NaN
[6 rows x 10 columns]
# Change your code to
In [5]: df.sub(df[0], axis=0) # align on axis 0 (rows)
Out[5]:
0 1 2 3
2000-01-01 0.0 -0.751976 -1.978171 -1.604745
2000-01-02 0.0 -1.385327 -1.092903 -2.256348
2000-01-03 0.0 -1.242720 0.366920 1.933653
2000-01-04 0.0 -1.428326 -1.761130 -0.449695
2000-01-05 0.0 0.991993 0.701204 -0.662428
2000-01-06 0.0 0.787338 -0.804737 1.198677
0.10.x シリーズでは非推奨の警告が表示され、非推奨の機能は0.11以降で削除されます。
resampleのデフォルト動作の変更
時系列resampleの日次Dおよびそれ*以上の*頻度のビニング動作のデフォルトがclosed='left', label='left'に変更されました。より低い頻度は影響を受けません。以前のデフォルトはユーザーに多くの混乱を引き起こしていました。特に、データを日次頻度にリサンプリングする場合(集約されたグループに期間の終わり、つまり翌日をラベル付けしていました)。
In [1]: dates = pd.date_range('1/1/2000', '1/5/2000', freq='4h')
In [2]: series = pd.Series(np.arange(len(dates)), index=dates)
In [3]: series
Out[3]:
2000-01-01 00:00:00 0
2000-01-01 04:00:00 1
2000-01-01 08:00:00 2
2000-01-01 12:00:00 3
2000-01-01 16:00:00 4
2000-01-01 20:00:00 5
2000-01-02 00:00:00 6
2000-01-02 04:00:00 7
2000-01-02 08:00:00 8
2000-01-02 12:00:00 9
2000-01-02 16:00:00 10
2000-01-02 20:00:00 11
2000-01-03 00:00:00 12
2000-01-03 04:00:00 13
2000-01-03 08:00:00 14
2000-01-03 12:00:00 15
2000-01-03 16:00:00 16
2000-01-03 20:00:00 17
2000-01-04 00:00:00 18
2000-01-04 04:00:00 19
2000-01-04 08:00:00 20
2000-01-04 12:00:00 21
2000-01-04 16:00:00 22
2000-01-04 20:00:00 23
2000-01-05 00:00:00 24
Freq: 4H, dtype: int64
In [4]: series.resample('D', how='sum')
Out[4]:
2000-01-01 15
2000-01-02 51
2000-01-03 87
2000-01-04 123
2000-01-05 24
Freq: D, dtype: int64
In [5]: # old behavior
In [6]: series.resample('D', how='sum', closed='right', label='right')
Out[6]:
2000-01-01 0
2000-01-02 21
2000-01-03 57
2000-01-04 93
2000-01-05 129
Freq: D, dtype: int64
無限大と負の無限大は、
isnullおよびnotnullによってNAとして扱われなくなりました。これらが扱われていたのは、初期のpandasの名残です。この動作は、mode.use_inf_as_nullオプションによってグローバルに再度有効にできます。
In [6]: s = pd.Series([1.5, np.inf, 3.4, -np.inf])
In [7]: pd.isnull(s)
Out[7]:
0 False
1 False
2 False
3 False
Length: 4, dtype: bool
In [8]: s.fillna(0)
Out[8]:
0 1.500000
1 inf
2 3.400000
3 -inf
Length: 4, dtype: float64
In [9]: pd.set_option('use_inf_as_null', True)
In [10]: pd.isnull(s)
Out[10]:
0 False
1 True
2 False
3 True
Length: 4, dtype: bool
In [11]: s.fillna(0)
Out[11]:
0 1.5
1 0.0
2 3.4
3 0.0
Length: 4, dtype: float64
In [12]: pd.reset_option('use_inf_as_null')
inplaceオプションを持つメソッドは、呼び出し元のオブジェクトではなく、すべてNoneを返すようになりました。例えば、df = df.fillna(0, inplace=True)のように書かれたコードは動作しなくなる可能性があります。修正するには、不要な変数への代入を削除するだけです。pandas.mergeは、デフォルトでグループキーをソートしなくなりました(sort=False)。これはパフォーマンス上の理由によるものです。グループキーのソートは、計算の中で最もコストのかかる部分の1つであることが多く、多くの場合不要です。ヘッダーのないファイルのデフォルト列名は、整数
0からN - 1に変更されました。これは、列が指定されていないDataFrameコンストラクタとの一貫性を保つためです。v0.9.0の動作(名前X0、X1、…)は、prefix='X'を指定することで再現できます。
In [6]: import io
In [7]: data = """
...: a,b,c
...: 1,Yes,2
...: 3,No,4
...: """
...:
In [8]: print(data)
a,b,c
1,Yes,2
3,No,4
In [9]: pd.read_csv(io.StringIO(data), header=None)
Out[9]:
0 1 2
0 a b c
1 1 Yes 2
2 3 No 4
In [10]: pd.read_csv(io.StringIO(data), header=None, prefix="X")
Out[10]:
X0 X1 X2
0 a b c
1 1 Yes 2
2 3 No 4
'Yes'や'No'のような値は、デフォルトではブール値として解釈されませんが、これは新しいtrue_valuesとfalse_values引数で制御できます。
In [4]: print(data)
a,b,c
1,Yes,2
3,No,4
In [5]: pd.read_csv(io.StringIO(data))
Out[5]:
a b c
0 1 Yes 2
1 3 No 4
In [6]: pd.read_csv(io.StringIO(data), true_values=["Yes"], false_values=["No"])
Out[6]:
a b c
0 1 True 2
1 3 False 4
ファイルパーサーは、
na_values引数で渡された場合、変換関数から生じる非文字列値をNAとして認識しません。代わりにreplace関数を使用して後処理を行う方が良いでしょう。SeriesまたはDataFrameに対して引数なしで
fillnaを呼び出すのは、もはや有効なコードではありません。塗りつぶし値または補間方法のいずれかを指定する必要があります。
In [6]: s = pd.Series([np.nan, 1.0, 2.0, np.nan, 4])
In [7]: s
Out[7]:
0 NaN
1 1.0
2 2.0
3 NaN
4 4.0
dtype: float64
In [8]: s.fillna(0)
Out[8]:
0 0.0
1 1.0
2 2.0
3 0.0
4 4.0
dtype: float64
In [9]: s.fillna(method="pad")
Out[9]:
0 NaN
1 1.0
2 2.0
3 2.0
4 4.0
dtype: float64
便利なメソッドffillおよびbfillが追加されました。
In [10]: s.ffill()
Out[10]:
0 NaN
1 1.0
2 2.0
3 2.0
4 4.0
dtype: float64
Series.applyは、適用された関数からの戻り値がそれ自体がシリーズである場合に操作を行い、結果をDataFrameにアップキャストする可能性があります。In [11]: def f(x): ....: return pd.Series([x, x ** 2], index=["x", "x^2"]) ....: In [12]: s = pd.Series(np.random.rand(5)) In [13]: s Out[13]: 0 0.340445 1 0.984729 2 0.919540 3 0.037772 4 0.861549 dtype: float64 In [14]: s.apply(f) Out[14]: x x^2 0 0.340445 0.115903 1 0.984729 0.969691 2 0.919540 0.845555 3 0.037772 0.001427 4 0.861549 0.742267
pandasオプションを操作するための新しいAPI関数 (GH 2097)
get_option/set_option- オプションの値を取得/設定します。部分名も受け入れられます。 -reset_option- 1つ以上のオプションをデフォルト値にリセットします。部分名も受け入れられます。 -describe_option- 1つ以上のオプションの説明を表示します。引数なしで呼び出された場合、登録されているすべてのオプションを表示します。
注意:
set_printoptions/reset_printoptionsは現在非推奨ですが(機能はします)、印刷オプションは「display.XYZ」の下にあります。例えばIn [15]: pd.get_option("display.max_rows") Out[15]: 15
to_string()メソッドは、常にユニコード文字列を返すようになりました (GH 2224)。
新機能#
ワイドDataFrameの出力#
サマリー情報を出力する代わりに、pandasはデフォルトで文字列表現を複数行に分割して出力するようになりました。
In [16]: wide_frame = pd.DataFrame(np.random.randn(5, 16))
In [17]: wide_frame
Out[17]:
0 1 2 ... 13 14 15
0 -0.548702 1.467327 -1.015962 ... 1.669052 1.037882 -1.705775
1 -0.919854 -0.042379 1.247642 ... 1.956030 0.017587 -0.016692
2 -0.575247 0.254161 -1.143704 ... 1.211526 0.268520 0.024580
3 -1.577585 0.396823 -0.105381 ... 0.593616 0.884345 1.591431
4 0.141809 0.220390 0.435589 ... -0.392670 0.007207 1.928123
[5 rows x 16 columns]
サマリー情報を出力する以前の動作は、「expand_frame_repr」印刷オプションを介して実現できます。
In [18]: pd.set_option("expand_frame_repr", False)
In [19]: wide_frame
Out[19]:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 -0.548702 1.467327 -1.015962 -0.483075 1.637550 -1.217659 -0.291519 -1.745505 -0.263952 0.991460 -0.919069 0.266046 -0.709661 1.669052 1.037882 -1.705775
1 -0.919854 -0.042379 1.247642 -0.009920 0.290213 0.495767 0.362949 1.548106 -1.131345 -0.089329 0.337863 -0.945867 -0.932132 1.956030 0.017587 -0.016692
2 -0.575247 0.254161 -1.143704 0.215897 1.193555 -0.077118 -0.408530 -0.862495 1.346061 1.511763 1.627081 -0.990582 -0.441652 1.211526 0.268520 0.024580
3 -1.577585 0.396823 -0.105381 -0.532532 1.453749 1.208843 -0.080952 -0.264610 -0.727965 -0.589346 0.339969 -0.693205 -0.339355 0.593616 0.884345 1.591431
4 0.141809 0.220390 0.435589 0.192451 -0.096701 0.803351 1.715071 -0.708758 -1.202872 -1.814470 1.018601 -0.595447 1.395433 -0.392670 0.007207 1.928123
各行の幅は「line_width」(デフォルトは80)で変更できます。
pd.set_option("line_width", 40)
wide_frame
PyTablesサポートの更新#
PyTables Table形式のドキュメントと、APIに対するいくつかの機能強化。期待できることの一部を以下に示します。
In [41]: store = pd.HDFStore('store.h5')
In [42]: df = pd.DataFrame(np.random.randn(8, 3),
....: index=pd.date_range('1/1/2000', periods=8),
....: columns=['A', 'B', 'C'])
In [43]: df
Out[43]:
A B C
2000-01-01 -2.036047 0.000830 -0.955697
2000-01-02 -0.898872 -0.725411 0.059904
2000-01-03 -0.449644 1.082900 -1.221265
2000-01-04 0.361078 1.330704 0.855932
2000-01-05 -1.216718 1.488887 0.018993
2000-01-06 -0.877046 0.045976 0.437274
2000-01-07 -0.567182 -0.888657 -0.556383
2000-01-08 0.655457 1.117949 -2.782376
[8 rows x 3 columns]
# appending data frames
In [44]: df1 = df[0:4]
In [45]: df2 = df[4:]
In [46]: store.append('df', df1)
In [47]: store.append('df', df2)
In [48]: store
Out[48]:
<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
/df frame_table (typ->appendable,nrows->8,ncols->3,indexers->[index])
# selecting the entire store
In [49]: store.select('df')
Out[49]:
A B C
2000-01-01 -2.036047 0.000830 -0.955697
2000-01-02 -0.898872 -0.725411 0.059904
2000-01-03 -0.449644 1.082900 -1.221265
2000-01-04 0.361078 1.330704 0.855932
2000-01-05 -1.216718 1.488887 0.018993
2000-01-06 -0.877046 0.045976 0.437274
2000-01-07 -0.567182 -0.888657 -0.556383
2000-01-08 0.655457 1.117949 -2.782376
[8 rows x 3 columns]
In [50]: wp = pd.Panel(np.random.randn(2, 5, 4), items=['Item1', 'Item2'],
....: major_axis=pd.date_range('1/1/2000', periods=5),
....: minor_axis=['A', 'B', 'C', 'D'])
In [51]: wp
Out[51]:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 5 (major_axis) x 4 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2000-01-01 00:00:00 to 2000-01-05 00:00:00
Minor_axis axis: A to D
# storing a panel
In [52]: store.append('wp', wp)
# selecting via A QUERY
In [53]: store.select('wp', [pd.Term('major_axis>20000102'),
....: pd.Term('minor_axis', '=', ['A', 'B'])])
....:
Out[53]:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 3 (major_axis) x 2 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2000-01-03 00:00:00 to 2000-01-05 00:00:00
Minor_axis axis: A to B
# removing data from tables
In [54]: store.remove('wp', pd.Term('major_axis>20000103'))
Out[54]: 8
In [55]: store.select('wp')
Out[55]:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 3 (major_axis) x 4 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2000-01-01 00:00:00 to 2000-01-03 00:00:00
Minor_axis axis: A to D
# deleting a store
In [56]: del store['df']
In [57]: store
Out[57]:
<class 'pandas.io.pytables.HDFStore'>
File path: store.h5
/wp wide_table (typ->appendable,nrows->12,ncols->2,indexers->[major_axis,minor_axis])
拡張機能
階層キーの機能が追加されました
In [58]: store.put('foo/bar/bah', df) In [59]: store.append('food/orange', df) In [60]: store.append('food/apple', df) In [61]: store Out[61]: <class 'pandas.io.pytables.HDFStore'> File path: store.h5 /foo/bar/bah frame (shape->[8,3]) /food/apple frame_table (typ->appendable,nrows->8,ncols->3,indexers->[index]) /food/orange frame_table (typ->appendable,nrows->8,ncols->3,indexers->[index]) /wp wide_table (typ->appendable,nrows->12,ncols->2,indexers->[major_axis,minor_axis]) # remove all nodes under this level In [62]: store.remove('food') In [63]: store Out[63]: <class 'pandas.io.pytables.HDFStore'> File path: store.h5 /foo/bar/bah frame (shape->[8,3]) /wp wide_table (typ->appendable,nrows->12,ncols->2,indexers->[major_axis,minor_axis])
混合dtypeのサポートが追加されました!
In [64]: df['string'] = 'string' In [65]: df['int'] = 1 In [66]: store.append('df', df) In [67]: df1 = store.select('df') In [68]: df1 Out[68]: A B C string int 2000-01-01 -2.036047 0.000830 -0.955697 string 1 2000-01-02 -0.898872 -0.725411 0.059904 string 1 2000-01-03 -0.449644 1.082900 -1.221265 string 1 2000-01-04 0.361078 1.330704 0.855932 string 1 2000-01-05 -1.216718 1.488887 0.018993 string 1 2000-01-06 -0.877046 0.045976 0.437274 string 1 2000-01-07 -0.567182 -0.888657 -0.556383 string 1 2000-01-08 0.655457 1.117949 -2.782376 string 1 [8 rows x 5 columns] In [69]: df1.get_dtype_counts() Out[69]: float64 3 int64 1 object 1 dtype: int64
テーブル書き込みのパフォーマンス向上
任意にインデックス付けされた次元のサポート
SparseSeriesにdensityプロパティが追加されました (GH 2384)Series.str.strip/lstrip/rstripメソッドが任意の文字を削除するための入力引数を受け入れるようになりました (GH 2411)meltでvalue_varsを実装し、値を特定の列に制限し、meltをpandas名前空間に追加しました (GH 2412)
バグ修正
where条件を指定するための
Termメソッドが追加されました (GH 1996)。del store['df']は、ストア削除のためにstore.remove('df')を呼び出すようになりました。連続した行の削除が以前よりもはるかに高速になりました
min_itemsizeパラメータをテーブル作成時に指定できるようになり、インデックス列の最小サイズを強制できるようになりました(以前の実装では、最初の追加に基づいて列サイズが設定されていました)。create_table_indexによるインデックスサポート(PyTables >= 2.3が必要) (GH 698)。テーブルが
putによって最初に作成されていない場合、ストアへの追加が失敗する問題ピクルスされたDataFrameをロードした後の属性の欠落に関する問題を修正 (GH2431)
selectとremoveに対する軽微な変更:whereが提供されている(かつNoneではない)場合にのみテーブルを要求するようになりました。
互換性
HDFStoreの0.10は、以前のバージョンのpandasで作成されたテーブルを読み込むことに関しては後方互換性がありますが、以前の(未文書化の)方法論を使用したクエリ用語はサポートされていません。更新を利用するには、ファイル全体を読み込み、新しい形式で書き出す必要があります。
N次元パネル(実験的)#
Panel4Dと、N次元の命名されたパネルを作成するファクトリ関数の実験的なサポートを追加しました。期待できることの一部を以下に示します。
In [58]: p4d = Panel4D(np.random.randn(2, 2, 5, 4),
....: labels=['Label1','Label2'],
....: items=['Item1', 'Item2'],
....: major_axis=date_range('1/1/2000', periods=5),
....: minor_axis=['A', 'B', 'C', 'D'])
....:
In [59]: p4d
Out[59]:
<class 'pandas.core.panelnd.Panel4D'>
Dimensions: 2 (labels) x 2 (items) x 5 (major_axis) x 4 (minor_axis)
Labels axis: Label1 to Label2
Items axis: Item1 to Item2
Major_axis axis: 2000-01-01 00:00:00 to 2000-01-05 00:00:00
Minor_axis axis: A to D
完全なリストについては、GitHub の完全なリリースノートまたはイシュートラッカーを参照してください。
貢献者#
合計26名がこのリリースにパッチを貢献しました。名前の横に「+」が付いている方は、初めてパッチを貢献された方です。
A. Flaxman +
Abraham Flaxman
Adam Obeng +
Brenda Moon +
Chang She
Chris Mulligan +
Dieter Vandenbussche
Donald Curtis +
Jay Bourque +
Jeff Reback +
Justin C Johnson +
K.-Michael Aye
Keith Hughitt +
Ken Van Haren +
Laurent Gautier +
Luke Lee +
Martin Blais
Tobias Brandt +
Wes McKinney
Wouter Overmeire
alex arsenovic +
jreback +
locojaydev +
timmie
y-p
zach powers +