Pandas根据缺失值和不同长度的拆分列创建新DataFrame
我有一堆分类数据,这些数据在每一行中都是连在一起的字符串(比如说 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
但是我不太确定该怎么做。我的数据表很大(有25,000行和5000个描述),所以这个方法需要高效。我试过用 str.split(' ').tolist()
,但我不太清楚怎么把这个结果转换成我想要的最终格式。
1 个回答
0
首先,用某种占位符填补缺失值,然后把数据分开。
b = b.fillna('_')
b['descriptor'] = b.str.split()
接着,按照这个回答中的方法,把数据转成列的形式,并去掉占位符。这样做的效率可能不是特别高,因为使用了apply,但对于你这个数据量来说,应该是可以接受的。
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