我有一堆分类数据在我的每一行中作为字符串(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()
,但我不确定如何将其转换为最终产品。
答案 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