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