Pandas从具有缺失值,不同长度的拆分列创建新DataFrame

时间:2014-08-13 14:48:41

标签: python pandas

我有一堆分类数据在我的每一行中作为字符串(string string string等)连接在一起。我需要将这些分类数据分成列,以便我有这样的东西:

       var1 var2 var3
row 1:    1    1    0
row 2:    0    0    1
row 3:    0    1    1   ....

可以使用以下方法生成分类数据:

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)

看起来像这样:

                 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

但我不确定如何处理这个问题。 DataFrame相当大(25,000行,5000个描述符),因此该方法必须具有高性能。我尝试使用str.split(' ').tolist(),但我不确定如何将其转换为最终产品。

1 个答案:

答案 0 :(得分:0)

首先,用某种哨兵填充缺失的值,然后拆分数据。

b = b.fillna('_')
b['descriptor'] = b.str.split()

然后,使用此answer中的方法,转入列,然后删除哨兵。由于申请的原因,这不具备超高性能,但对于您的尺寸数据可能是合理的。

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