Pandas根据缺失值和不同长度的拆分列创建新DataFrame

0 投票
1 回答
699 浏览
提问于 2025-04-18 17:09

我有一堆分类数据,这些数据在每一行中都是连在一起的字符串(比如说 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

撰写回答