8

私はこのようなものを意味します:

DataFrameカテゴリまたは名目上の可能性のある列があります。観測値(行)ごとに、変数のすべての可能な値が独自のバイナリ変数になる新しい行を生成したいと思います。たとえば、このマトリックス(最初の行は列ラベルです)

'a'     'b'     'c'
one     0.2     0
two     0.4     1
two     0.9     0
three   0.1     2
one     0.0     4
two     0.2     5

次のようなものに変換されます:

'a'              'b'                                                    'c'
one  two  three  [0.0,0.2)  [0.2,0.4)  [0.4,0.6)  [0.6,0.8)  [0.8,1.0]   0   1   2   3   4   5

 1    0     0        0          1          0          0          0       1   0   0   0   0   0
 0    1     0        0          0          0          0          1       0   1   0   0   0   0
 0    1     0        0          0          0          0          1       1   0   0   0   0   0
 0    0     1        1          0          0          0          0       0   0   1   0   0   0
 1    0     0        1          0          0          0          0       0   0   0   0   1   0
 0    1     0        0          1          0          0          0       0   0   0   0   0   1

初期行列の各変数(列)は、すべての可能な値にビニングされます。カテゴリの場合、可能な値はそれぞれ新しい列になります。フロートの場合、値は何らかの方法でビニングされます(たとえば、常に10個のビンに分割されます)。それがintの場合、それはすべての可能なint値、またはおそらくビニングである可能性があります。

参考:私の実際のアプリケーションでは、テーブルには最大200万行があり、完全な「拡張」マトリックスには数百の列が含まれる場合があります。

この操作を実行する簡単な方法はありますか?

これとは別に、Burtテーブル(クロス集計の対称行列)を実際に計算しようとしているので、このステップをスキップすることもできます。関数で同様のことを行う簡単な方法はありcrosstabますか?それ以外の場合、分割表の計算は単純な行列の乗算です。

4

5 に答える 5

33

連続データを離散化するための新しい関数cutと関数を実装したことに注意してください。qcut

http://pandas-docs.github.io/pandas-docs-travis/basics.html#discretization-and-quantiling

于 2012-06-12T21:52:56.733 に答える
6

a例のand列のようなラベル付きの列には、パンダの組み込みメソッドget_dummies()cを使用できます。

元。:

import pandas as pd
s1 = ['a', 'b', np.nan]
pd.get_dummies(s1)
       a  b
    0  1  0
    1  0  1
    2  0  0
于 2015-03-22T12:13:58.643 に答える
5

ある種のブロードキャストを使用できます。

    In [58]: df
    Out[58]:
           a    b  c
    0    one  0.2  0
    1    two  0.4  1
    2    two  0.9  0
    3  three  0.1  2
    4    one  0.0  4
    5    two  0.2  5

    In [41]: (df.a.values[:,numpy.newaxis] == df.a.unique()).astype(int)
    Out[41]:
    array([[1, 0, 0],
           [0, 1, 0],
           [0, 1, 0],
           [0, 0, 1],
           [1, 0, 0],
           [0, 1, 0]])

    In [54]: ((0 <= df.b.values[:,numpy.newaxis]) & (df.b.values[:,numpy.newaxis] < 0.2)).astype(int)
    Out[54]:
    array([[0],
           [0],
           [0],
           [1],
           [1],
           [0]])

    In [59]: (df.c.values[:,numpy.newaxis] == df.c.unique()).astype(int)
    Out[59]:
    array([[1, 0, 0, 0, 0],
           [0, 1, 0, 0, 0],
           [1, 0, 0, 0, 0],
           [0, 0, 1, 0, 0],
           [0, 0, 0, 1, 0],
           [0, 0, 0, 0, 1]])

そして、すべてのピースを一緒に、pandas.concatまたは類似のものに結合します。

于 2012-05-29T08:13:14.277 に答える
3

あなたがpatsyのシンプルさを打ち負かすとは思えません。このタスクのために正確に設計されました。

>>> from patsy import dmatrix
>>> dmatrix('C(a) + C(b) + C(c) - 1', df, return_type='dataframe')

   C(a)[one]  C(a)[three]  C(a)[two]  C(b)[T.0.1]  C(b)[T.0.2]  C(b)[T.0.4]   C(b)[T.0.9]  C(c)[T.1]  C(c)[T.2]  C(c)[T.4]  C(c)[T.5]  
0          1            0          0            0            1            0             0          0          0          0          0  
1          0            0          1            0            0            1             0          1          0          0          0  
2          0            0          1            0            0            0             1          0          0          0          0  
3          0            1          0            1            0            0             0          0          1          0          0  
4          1            0          0            0            0            0             0          0          0          1          0  
5          0            0          1            0            1            0             0          0          0          0          1  

ここで、C(a)手段は変数をカテゴリカルに変換し-1、切片列の出力を回避します。

于 2013-08-02T14:37:38.100 に答える