我将给出一个我想要的非常简单的例子(因为我正在处理一个非常大的数据集,所以希望这个任务实际上是可行的)
假设我有以下数据框,其中包含以下行、列和相应的值:
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
所以基本上,总而言之,我希望每一列只有一个数字(但我也希望代码适用于字符串而不是整数,因为这就是我正在做的事情)并且我希望每一行保留它原来的所有数字,只是它们将被分配到许多列。此外,我目前有大约 400,000 行和 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
sample 运行-
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
