Python 熊猫从缺少值、长度不同的拆分列创建新数据帧

Python 熊猫从缺少值、长度不同的拆分列创建新数据帧,python,pandas,Python,Pandas,我的每一行中都有一组分类数据,它们作为字符串(string等)连接在一起。我需要将这些分类数据分成列,这样我就有了如下内容: var1 var2 var3 row 1: 1 1 0 row 2: 0 0 1 row 3: 0 1 1 .... descriptor 0 NaN 1 var0 var1 2

我的每一行中都有一组分类数据,它们作为字符串(
string
等)连接在一起。我需要将这些分类数据分成列,这样我就有了如下内容:

       var1 var2 var3
row 1:    1    1    0
row 2:    0    0    1
row 3:    0    1    1   ....
                 descriptor
0                       NaN
1                 var0 var1
2       var0 var1 var2 var3
3            var0 var2 var4
4                 var0 var4
5                      var3
6  var0 var1 var2 var3 var4
7            var0 var1 var2
可使用以下方法生成分类数据:

import pandas as pd, numpy as np

np.random.seed(75)
a = [" ".join(np.unique(['var%d'%np.random.randint(5) for i in range(np.random.randint(10))])) for i in range(np.random.randint(10))]
a[0] = np.nan

b = pd.DataFrame(a, columns=['descriptor'])
print(b)
看起来是这样的:

       var1 var2 var3
row 1:    1    1    0
row 2:    0    0    1
row 3:    0    1    1   ....
                 descriptor
0                       NaN
1                 var0 var1
2       var0 var1 var2 var3
3            var0 var2 var4
4                 var0 var4
5                      var3
6  var0 var1 var2 var3 var4
7            var0 var1 var2
我想构建以下内容

   var0  var1  var2  var3  vars4
0     0     0     0     0      0
1     1     1     0     0      0
2     1     1     1     1      0
3     1     0     1     0      1
4     1     0     0     0      1
5     0     0     0     1      0
6     1     1     1     1      1
7     1     1     1     0      0

但我不知道该怎么做。数据帧相当大(25000行,5000个描述符),因此必须执行该方法。我尝试使用str.split(“”).tolist(),但我不确定如何将其转换为最终产品。

首先,用某种哨兵填充缺少的值,然后分割数据

b = b.fillna('_')
b['descriptor'] = b.str.split()
然后,使用本文中的方法,将数据透视到列中,并删除哨兵。由于应用的原因,这不会是超性能的,但在您的大小的数据上可能是合理的

s = b['descriptor'].apply(lambda x: pd.Series(1,index=x)).fillna(0).drop('_', axis=1)

In [115]: s
Out[115]: 
   var0  var1  var2  var3  var4
0     0     0     0     0     0
1     1     1     0     0     0
2     1     1     1     1     0
3     1     0     1     0     1
4     1     0     0     0     1
5     0     0     0     1     0
6     1     1     1     1     1
7     1     1     1     0     0