5

DataFrame行にa を使用するパンダがMultiIndexあります。

index = pandas.MultiIndex.from_tuples(list(itertools.product(range(3), range(3))))
df = pandas.DataFrame(numpy.random.randn(9,3), index=index, columns=['A', 'B', 'C'])

            A         B         C
0 0  2.400417  0.698638  1.231540
  1 -0.023154 -2.110450  0.774964
  2 -1.282392 -0.062794  1.471655
1 0 -1.081853  0.261876 -1.771075
  1 -2.013747 -0.377957 -0.393802
  2  1.711172 -0.552468  1.018727
2 0  0.155821 -0.222691  0.496586
  1  0.563638 -0.756709  1.050212
  2 -1.446159 -0.891549  0.256695

この DataFrame をインデックスの最初のレベルでシャッフルしたいので、考えられる結果は次のようになります。

            A         B         C
1 0 -1.081853  0.261876 -1.771075
  1 -2.013747 -0.377957 -0.393802
  2  1.711172 -0.552468  1.018727
0 0  2.400417  0.698638  1.231540
  1 -0.023154 -2.110450  0.774964
  2 -1.282392 -0.062794  1.471655
2 0  0.155821 -0.222691  0.496586
  1  0.563638 -0.756709  1.050212
  2 -1.446159 -0.891549  0.256695
4

3 に答える 3

6

reindexメソッドは、目的の順序に一致する並べ替えられたタプルの配列を渡すと、これを実現できます。その時点で、問題に最も適した順序に並べ替えることができます。例えば:

In [38]: df
Out[38]: 
            A         B         C
0 0 -1.725337  0.111493  0.178294
  1 -1.809003 -0.614219 -0.931909
  2  0.621427 -0.186233  0.254727
1 0 -1.322863  1.242415  1.375579
  1  0.249738 -1.280204  0.356491
  2 -0.743671  0.325841 -0.167772
2 0 -0.070937  0.401172 -1.790801
  1  1.433794  2.257198  1.848435
  2 -1.021557 -1.054363 -1.485536

In [39]: neworder = [1, 0, 2]

In [41]: newindex = sorted(df.index, key=lambda x: neworder.index(x[0]))

In [42]: newindex
Out[42]: 
[(1L, 0L),
 (1L, 1L),
 (1L, 2L),
 (0L, 0L),
 (0L, 1L),
 (0L, 2L),
 (2L, 0L),
 (2L, 1L),
 (2L, 2L)]

In [43]: df.reindex(newindex)
Out[43]: 
            A         B         C
1 0 -1.322863  1.242415  1.375579
  1  0.249738 -1.280204  0.356491
  2 -0.743671  0.325841 -0.167772
0 0 -1.725337  0.111493  0.178294
  1 -1.809003 -0.614219 -0.931909
  2  0.621427 -0.186233  0.254727
2 0 -0.070937  0.401172 -1.790801
  1  1.433794  2.257198  1.848435
  2 -1.021557 -1.054363 -1.485536
于 2012-05-05T13:49:37.423 に答える
0

以下が機能する場合ははるかに簡単ですが、機能しません:

df.ix[[1, 0, 2]]

以下は、より多くの回避策です。もっと良い方法があるかもしれませんが、私は何も理解できませんでした。DataFrameこれは単に「スライス」のリストを正しい順序で作成し、それらを で連結するだけpandas.concatです。

In : df
Out:
            A         B         C
0 0  1.202098 -0.031121  1.417629
  1 -0.895862  0.697531 -0.572411
  2  1.179101 -0.008602  1.583385
1 0  1.969477 -0.968004 -0.567695
  1 -1.504443 -0.002264 -0.413091
  2 -1.412457  0.310518  0.267475
2 0 -0.385933 -0.471800 -0.598141
  1 -0.105032  0.443437 -0.615566
  2 -1.035326 -0.282289 -0.042762

In : shuffled = [2,0,1]

In : df2 = pandas.concat([df.ix[i:i] for i in shuffled])

In : df2
Out:
            A         B         C
2 0 -0.385933 -0.471800 -0.598141
  1 -0.105032  0.443437 -0.615566
  2 -1.035326 -0.282289 -0.042762
0 0  1.202098 -0.031121  1.417629
  1 -0.895862  0.697531 -0.572411
  2  1.179101 -0.008602  1.583385
1 0  1.969477 -0.968004 -0.567695
  1 -1.504443 -0.002264 -0.413091
  2 -1.412457  0.310518  0.267475
于 2012-05-05T03:16:40.570 に答える