我将给出一个我想要的非常简单的示例(因为我正在处理一个非常大的数据集,因此希望该任务实际上是可行的)
假设我有以下具有以下行,列和对应值的数据框:
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