0

整数または「index」、「column」、「minor_axis」などではなく、ユーザー定義の名前で pandas コンテナー (DataFrame、Panel など) の軸にアクセスする方法があるかどうか疑問に思っています...

たとえば、次のデータ コンテナーを使用します。

df = DataFrame(randn(3,2),columns=['c1','c2'],index=['i1','i2','i3'])
df.index.name = 'myaxis1'
df.columns.name = 'myaxis2'

私はこれをしたいと思います:

df.sum(axis='myaxis1') 
df.xs('c1', axis='myaxis2')  # cross section

また、非常に便利です:

df.reshape(['myaxis2','myaxis1']) 

(この場合はあまり関係ありませんが、次元が上がるとそうなる可能性があります)

その理由は、「時間」、「変数」、「パーセンタイル」など、さまざまな次元の多次元配列で多くの作業を行っているためです...同じコードが、DataFrame、Panel などのオブジェクトに適用されることがよくあります。あるいは、MultiIndex を使用した Panel4D または DataFrame ですらあります。今のところ、どの軸が合計または平均を計算するのに適しているかを知るために、オブジェクトの形状やスクリプトの一般的な設定をテストすることがよくあります。しかし、コンテナーが詳細 (DataFrame、Panel など) でどのように実装されているかを忘れて、問題の性質について単純に考える方がはるかに便利だと思います (たとえば、時間をかけて平均化したい、いくつかのパーセンタイルを使用する「確率的」モードで作業するか、単一の時系列を使用する「決定論的」モードで作業するかについては考えたくありません)。

この投稿を書いているときに、非常に便利な軸属性を (再) 発見しました。上記のコードは次のように変換できます。

nms = [ax.name for ax in df.axes]
axid1 = nms.index('myaxis1')
axid2 = nms.index('myaxis2')
df.sum(axis=axid1) 
df.xs('c1', axis=axid2)  # cross section

および「変形」機能 (ただし、3 次元のケースには適用されません...):

newshape = ['myaxis2','myaxis1']
axid = [nms.index(nm) for nm in newshape]
df.swapaxes(*axid)

さて、この投稿を書いている間にこれらの解決策を見つけたことを認めなければなりません (そして、これはすでに非常に便利です) が、MultiIndex 軸を持つ DataFrame (またはその他) を説明するために一般化することができ、すべての軸とラベルを検索します。 ...

私の意見では、これは pandas の使いやすさの大幅な改善になるでしょう (実際の構造を忘れるとパフォーマンス コストがかかる可能性がありますが、パフォーマンスを心配するユーザーはデータの整理方法に注意することができます)。

どう思いますか?

4

1 に答える 1

0

これはまだ実験段階ですが、次のページをご覧ください。

http://pandas.pydata.org/pandas-docs/dev/dsintro.html#panelnd-experimental

import pandas
import numpy as np

from pandas.core import panelnd

MyPanel4D = panelnd.create_nd_panel_factory(
    klass_name   = 'MyPanel4D',
    axis_orders  = ['axis4', 'axis3', 'axis2', 'axis1'],
    axis_slices  = {'axis3': 'items',
                    'axis2': 'major_axis',
                    'axis1': 'minor_axis'},
    slicer       = 'Panel',
    stat_axis=2) 
mp4d = MyPanel4D(np.random.rand(5,4,3,2))
print mp4d

この結果

<class 'pandas.core.panelnd.MyPanel4D'>
Dimensions: 5 (axis4) x 4 (axis3) x 3 (axis2) x 2 (axis1)
Axis4 axis: 0 to 4
Axis3 axis: 0 to 3
Axis2 axis: 0 to 2
Axis1 axis: 0 to 1

カスタムオブジェクトの階層を作成しない限り、パネルを取り戻すようにスライスするときの注意点mp4d[0]があります(残念ながら、パネル/データフレームの「名前変更」をサポートするために0.12-devを待つ必要があります。リクエストはありませんでした)

したがって、より高い薄暗いオブジェクトには、独自の名前構造を課すことができます。軸のエイリアシングはあなたが示唆しているように機能するはずですが、いくつかのバグがあると思います

于 2013-03-20T20:47:49.083 に答える