3

パンダの短軸に沿ってデータのPanelフレームを拡張したいと思います。パネルを生成するためにのをdic作成することから始めます。DataFrame

import pandas as pd
import numpy as np
rng = pd.date_range('1/1/2013',periods=100,freq='D')
df1 = pd.DataFrame(np.random.randn(100, 4), index = rng, columns = ['A','B','C','D'])
df2 = pd.DataFrame(np.random.randn(100, 4), index = rng, columns = ['A','B','C','D'])
df3 = pd.DataFrame(np.random.randn(100, 4), index = rng, columns = ['A','B','C','D'])
pf = pd.Panel({'df1':df1,'df2':df2,'df3':df3})

予想通り、次の寸法のパネルがあることがわかりました。

寸法:3(アイテム)x 100(メジャー軸)x 4(マイナー軸)アイテム軸:df1〜df3メジャー軸軸:2013-01-01 00:00:00〜2013-04-10 00:00:00マイナー軸軸:A Dへ

ここで、マイナー軸に新しいデータセットを追加します。

pf['df1']['E'] = pd.DataFrame(np.random.randn(100, 1), index = rng)
pf['df2']['E'] = pd.DataFrame(np.random.randn(100, 1), index = rng)
pf['df2']['E'] = pd.DataFrame(np.random.randn(100, 1), index = rng)

この新しい短軸を追加した後、パネル配列の寸法の形状は変更されていないことがわかりました。

shape(pf)

[3,100,4]

major_axisの各アイテムのデータにアクセスできます。

pf.ix['df1',-10:,'E']

2013-04-01 0.168205 2013-04-02 0.677929 2013-04-03 0.845444 2013-04-04 0.431610 2013-04-05 0.501003 2013-04-06 -0.403605 2013-04-07 -0.185033 2013-04-08 0.270093 2013-04-09 1.569180 2013-04-10 -1.374779周波数:D、名前:E

しかし、スライスを拡張して複数の主軸を含めると、次のようになります。

pf.ix[:,:,'E']

次に、「E」が不明であるというエラーが発生します。

誰かが私がどこで間違っているのか、またはこの操作を実行するためのより良い方法を提案できますか?

4

2 に答える 2

5

これは現在機能しません。https://github.com/pydata/pandas/issues/2578を参照してください。ただし、 この方法で目的を達成できます。何もコピーされないため、これはかなり安価な操作です。

In [18]: x = pf.transpose(2,0,1)

In [19]: x
Out[19]: 
<class 'pandas.core.panel.Panel'>
Dimensions: 4 (items) x 3 (major_axis) x 100 (minor_axis)
Items axis: A to D
Major_axis axis: df1 to df3
Minor_axis axis: 2013-01-01 00:00:00 to 2013-04-10 00:00:00

In [20]: x['E'] = new_df

In [21]: x.transpose(1,2,0)
Out[21]: 
<class 'pandas.core.panel.Panel'>
Dimensions: 3 (items) x 100 (major_axis) x 5 (minor_axis)
Items axis: df1 to df3
Major_axis axis: 2013-01-01 00:00:00 to 2013-04-10 00:00:00
Minor_axis axis: A to E
于 2013-03-12T14:44:25.813 に答える
3

バグは修正されたようですが、あなたの質問に興味がありました。

移調せずに長軸と短軸のパネルにスライスを効果的に追加できるため、次の2行で、データフレームのサイズに頭を悩ませるのを防ぐことができます...

pf.ix[:,'another major axis',:] = pd.DataFrame(np.random.randn(pf.minor_axis.shape[0],pf.items.shape[0]), index=pf.minor_axis, columns=pf.items)

pf.ix[:, :, 'another minor axis'] = pd.DataFrame(np.random.randn(pf.major_axis.shape[0],pf.items.shape[0]), index=pf.major_axis, columns=pf.items)

しかし、もっと簡単なものがあるのだろうか?

さまざまな軸に沿ってスライスを追加するコードの下。

import pandas as pd
import numpy as np

rng = pd.date_range('25/11/2014', periods=2, freq='D')
df1 = pd.DataFrame(np.random.randn(2, 5), index=rng, columns=['A', 'B', 'C', 'D', 'E'])
df2 = pd.DataFrame(np.random.randn(2, 5), index=rng, columns=['A', 'B', 'C', 'D', 'E'])
df3 = pd.DataFrame(np.random.randn(2, 5), index=rng, columns=['A', 'B', 'C', 'D', 'E'])


pf = pd.Panel({'df1': df1, 'df2': df2, 'df3': df3})

# print("slice before adding df4:\n")
# for i in pf.items:
#     print("{}:\n{}".format(i, pf[i]))

pf['df4'] = pd.DataFrame(np.random.randn(pf.major_axis.shape[0], pf.minor_axis.shape[0]), index=pf.major_axis, columns=pf.minor_axis)
print pf

# print("slice after df4 before transposing 1:\n")
# for i in pf.items:
#     print("{}:\n{}".format(i, pf[i]))

x = pf.transpose(1, 0, 2)

x['new major axis item'] = pd.DataFrame(np.random.randn(pf.items.shape[0], pf.minor_axis.shape[0]), index=pf.items,
                                        columns=pf.minor_axis)

pf = x.transpose(1, 0, 2)

print pf
# print("slice after:\n")
# for i in pf.items:
#     print("{}:\n{}".format(i, pf[i]))

print("success on adding slice on major axis:")
print pf.major_xs(key='new major axis item')
print("trying to add major axis directly")
pf.ix[:,'another major axis',:] = pd.DataFrame(np.random.randn(pf.minor_axis.shape[0],pf.items.shape[0]), index=pf.minor_axis, columns=pf.items)

print pf.major_xs(key='another major axis')
print pf
于 2014-11-28T09:58:56.513 に答える