2

この投稿で質問するのは非常に恥ずかしいです。なぜなら、それは完全に初歩的だからです。それでも、私は過去 2 時間、pandasドキュメントを熟読し、太陽の下ですべてを試してみましたが、役に立ちませんでした...

たとえば、次のようなデータフレームを考えてみましょう。

     A   B   C   D      x      y      z
0   a0  b0  c0  d0  0.007  0.710  0.990
1   a0  b0  c0  d1  0.283  0.040  1.027
2   a0  b0  c1  d0  0.017  0.688  2.840
3   a0  b0  c1  d1  0.167  0.132  2.471
4   a0  b1  c0  d0  0.041  0.851  1.078
5   a0  b1  c0  d1  0.235  1.027  1.027
6   a0  b1  c1  d0  0.037  0.934  2.282
7   a0  b1  c1  d1  0.023  1.049  2.826
8   a1  b0  c0  d0  0.912  0.425  1.055
9   a1  b0  c0  d1  0.329  0.932  0.836
10  a1  b0  c1  d0  0.481  0.681  0.997
11  a1  b0  c1  d1  0.782  0.595  2.294
12  a1  b1  c0  d0  0.264  0.918  0.857
13  a1  b1  c0  d1  0.053  1.001  0.920
14  a1  b1  c1  d0  1.161  1.090  1.470
15  a1  b1  c1  d1  0.130  0.992  2.121

ABC、およびの個別の値の各組み合わせはD、このデータフレームで 1 回だけ発生することに注意してください。したがって、この列のサブセットを「キー列」と見なし、残りの列を「値列」と見なすことができます1

column を「unstacking」して、このフレームから新しいフレームを作成したいと思いますC。つまり、残りの「キー列」( AB、およびD) の値の個別の組み合わせごとに、C列の値によって、新しいフレームで対応する「値列」が生成されます。

たとえば、列を無視するxy、さしあたり、上記のアンスタック操作でデータフレームが生成されます。

    A   B   D     c0     c1
0  a0  b0  d0  0.990  2.840
1  a0  b0  d1  1.027  2.471
2  a0  b1  d0  1.078  2.282
3  a0  b1  d1  1.027  2.826
4  a1  b0  d0  1.055  0.997
5  a1  b0  d1  0.836  2.294
6  a1  b1  d0  0.857  1.470
7  a1  b1  d1  0.920  2.121

ここで、新しい列c0およびの値は、列、、およびの値の対応する一意の組み合わせに対して、c1列 の (元のデータフレーム内の) 値から取得されます。zABD

これどうやってするの?

x元のフレーム (つまり、すべての値 column 、y、および) で同様のアンスタック操作を実行できると便利ですz。新しいフレームで何らかの形式の階層的な列編成を使用します (つまり、現在の列xy、そして、それぞれzが順番に「サブカラム」とで構成される)、または複合名を使用して新しい列に名前を付けるためのスキーム (たとえば、新しいフレームで column 、、およびが列 column 、、、、、およびに置き換えられる可能性があります)。など)、しかし、これは期待しすぎかもしれません...c0c1xyzx_c0x_c1y_c0y_c1z_c0z_c1

PS: 上記のデータフレームのデータを TSV 形式で示します。

A   B       C       D       x       y       z
a0  b0      c0      d0      0.007   0.71    0.99
a0  b0      c0      d1      0.283   0.04    1.027
a0  b0      c1      d0      0.017   0.688   2.84
a0  b0      c1      d1      0.167   0.132   2.471
a0  b1      c0      d0      0.041   0.851   1.078
a0  b1      c0      d1      0.235   1.027   1.027
a0  b1      c1      d0      0.037   0.934   2.282
a0  b1      c1      d1      0.023   1.049   2.826
a1  b0      c0      d0      0.912   0.425   1.055
a1  b0      c0      d1      0.329   0.932   0.836
a1  b0      c1      d0      0.481   0.681   0.997
a1  b0      c1      d1      0.782   0.595   2.294
a1  b1      c0      d0      0.264   0.918   0.857
a1  b1      c0      d1      0.053   1.001   0.92
a1  b1      c1      d0      1.161   1.09    1.47
a1  b1      c1      d1      0.13    0.992   2.121

1より明示的には、データフレームは、キーが 4- tuplesで、値が 3- tuples であるaに同形です。私が試みた多くのことの 1 つは、「キー列」の一意の組み合わせによってデータフレームにインデックスを付ける方法を見つけることでした。同じ話: これは の「hello-world」レベルのものである必要がありますが、ドキュメントでそれを行う方法を見つけることができませんでした。明らかに、私の脳とドキュメントを書いた人の脳は互いに完全に直交しています...dict('a0', 'b0', 'c0', 'd0'), ('a0', 'b0', 'c0', 'd1'), ..., ('a1', 'b1', 'c1', 'd1')(0.007, 0.710, 0.990), (0.283, 0.040, 1.027), ..., (0.130, 0.992, 2.121)pandaspandas

4

1 に答える 1

2

元のフレーム (つまり、すべての値の列 x、y、および z を持つもの) で同様のスタック解除操作を実行できると便利です。列 x、y、および z は、それぞれ「サブ列」c0 および c1 で構成されます)

どうですか:

>>> df.pivot_table(values=["x","y","z"],rows=["A","B","D"], cols="C")
              x             y             z       
C            c0     c1     c0     c1     c0     c1
A  B  D                                           
a0 b0 d0  0.007  0.017  0.710  0.688  0.990  2.840
      d1  0.283  0.167  0.040  0.132  1.027  2.471
   b1 d0  0.041  0.037  0.851  0.934  1.078  2.282
      d1  0.235  0.023  1.027  1.049  1.027  2.826
a1 b0 d0  0.912  0.481  0.425  0.681  1.055  0.997
      d1  0.329  0.782  0.932  0.595  0.836  2.294
   b1 d0  0.264  1.161  0.918  1.090  0.857  1.470
      d1  0.053  0.130  1.001  0.992  0.920  2.121

こちらを参照してください。デフォルトの集計関数はmeanです。ここのように、同じセルに複数の値がないことがわかっている場合、それは大した問題ではありませんが、私はそれがsum.

于 2013-11-03T14:12:59.383 に答える