【问题标题】:Pandas creating new DataFrame from split columns with missing values, differing lengthsPandas 从具有缺失值、不同长度的拆分列创建新的 DataFrame
【发布时间】:2014-08-13 23:16:47
【问题描述】:

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

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先,用某种标记填充缺失值,然后拆分数据。

    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
    

    【讨论】:

      猜你喜欢
      • 2020-05-04
      • 2021-11-28
      • 2020-12-31
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 2022-08-05
      • 2020-09-13
      相关资源
      最近更新 更多