如何将pandas数据帧中的值离散化并转换为二进制矩阵?

2024-06-20 12:28:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我的意思是这样的:

我有一个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值,或者也可以是binning。

仅供参考:在我的实际应用程序中,表最多有200万行,完整的“扩展”矩阵可能有数百列。

有什么简单的方法来执行这个操作吗?

另外,我也愿意跳过这一步,因为我正在尝试计算一个Burt表(这是交叉表的对称矩阵)。有没有一种简单的方法可以用crosstab函数做类似的事情?否则,计算交叉表只是简单的矩阵乘法。


Tags: 方法dataframe方式二进制分类矩阵标签one
3条回答

对于示例中的标记列,如ac列,可以使用pandas内置方法get_dummies()

例如:

import pandas as pd
s1 = ['a', 'b', np.nan]
pd.get_dummies(s1)
       a  b
    0  1  0
    1  0  1
    2  0  0

你可以使用某种广播:

    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或类似的方法将所有部分连接在一起。

注意,我已经实现了新的cutqcut函数来离散连续数据:

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

相关问题 更多 >