我将给出一个我想要的非常简单的示例(因为我正在处理一个非常大的数据集,因此希望该任务实际上是可行的)

假设我有以下具有以下行,列和对应值的数据框:

A     B     C
1     2     5
2     3     7
3     7     9


成为

A    B   C   D   E   F
1    2       5
     2   3       7
         3       7   9


因此,从本质上讲,总而言之,我希望每一列都只有一个数字(但我也希望代码适用于字符串而不是整数,因为这就是我正在使用的方式),并且我希望每一行都保留所有它最初拥有的编号,只是将它们分配到许多列中。另外,我目前大约有40万行和300列可以使用,并且当然需要创建更多的列才能执行此操作,因此这里的计算量也很大。有什么建议么?谢谢!

编辑:

我正在从实际数据集中添加一个非常小的样本,因为它可能更好地表明了我正在使用的数据类型:

  1               2             3
0 220008-926      22008-970     None
1 10755-JT        None          None
2 16218-230       None          None
3 None            16218-230     10755-JT


我想将以上转换为以下内容

     22008-926       22008-970     10755-JT    16218-230

0    22008-926       22008-970
1                                  10755-JT
2                                              16218-230
3                                  10755-JT    16218-230


然后显示如下内容,但我可以在找到上一个步骤后执行此最后一步(当前标题仅为1、2、3 ...,而不是22008-926、22008-970、10755-JT )...

  22008-926       22008-970     10755-JT        16218-230
0     1              1             0               0
1     0              0             1               0
2     0              0             0               1
3     0              0             1               1

最佳答案

这是一种方法-

def expand_arr(a):  # a is array
    unq = np.unique(a)
    m,n = a.shape[0], len(unq)
    out = np.zeros((m,n), dtype=a.dtype)
    out[np.arange(m)[:,None], np.searchsorted(unq, a)] = a
    return out


样品运行-

In [280]: df
Out[280]:
   A  B  C
0  1  2  5
1  2  3  7
2  3  7  9

In [281]: pd.DataFrame(expand_arr(df.values))
Out[281]:
   0  1  2  3  4  5
0  1  2  0  5  0  0
1  0  2  3  0  7  0
2  0  0  3  0  7  9

07-26 08:25