2

単一レベルのインデックスを持つ Pandas シリーズを取得し、そのインデックスを複数の列を持つデータフレームに分割したいと思います。たとえば、入力の場合:

s = pd.Series(range(10,17), index=['a','a','b','b','c','c','c'])

s
a    10
a    11
b    12
b    13
c    14
c    15
c    16
dtype: int64

私が出力として望むものは次のとおりです。

    a    b    c
0   10   12   14
1   11   13   15
2   NaN  NaN  16

マルチインデックスが必要で、単一レベルのインデックスしかないため、unstack コマンドを直接使用することはできません。すべてが同じ値を持つダミーのインデックスを入れようとしましたが、「ReshapeError: インデックスには重複したエントリが含まれています。形状を変更できません」というエラーが発生しました。

1)パンダは不規則な配列を好まないため、パディングが必要になる、2)インデックスを任意にリセットする必要がある、3)データフレームを実際に「初期化」できないため、これは少し珍しいことを知っています最長の列の長さがわかるまで。しかし、これはまだ私が何とかできるはずのことのようです。groupby 経由で行うことも考えましたが、おそらく上記の理由により、集計関数のない grouped_df.values() のようなものはないようです。

4

2 に答える 2

2

groupbyapplyreset_indexを使用してマルチインデックス シリーズを作成し、次を呼び出すことができますunstack

import pandas as pd
s = pd.Series(range(10,17), index=['a','a','b','b','c','c','c'])
df = s.groupby(level=0).apply(pd.Series.reset_index, drop=True).unstack(0)
print df

出力:

   a   b   c
0  10  12  14
1  11  13  15
2 NaN NaN  16
于 2013-07-03T01:53:00.047 に答える
0

これがどれほど一般化可能かはわかりません。これを concat パターン経由の groupby と呼びます。基本的には適用ですが、その組み合わせを正確に制御できます。

In [24]: s = pd.Series(range(10,17), index=['a','a','b','b','c','c','c'])

In [25]: df = DataFrame(dict(key = s.index, value = s.values))

In [26]: df
Out[26]: 
  key  value
0   a     10
1   a     11
2   b     12
3   b     13
4   c     14
5   c     15
6   c     16

In [27]: concat(dict([ (g,Series(grp['value'].values)) for g, grp in df.groupby('key') ]),axis=1)
Out[27]: 
    a   b   c
0  10  12  14
1  11  13  15
2 NaN NaN  16
于 2013-07-02T21:01:02.947 に答える