【问题标题】:What's the best way to transform Array values in one column to columns of the original DataFrame?将一列中的数组值转换为原始 DataFrame 列的最佳方法是什么?
【发布时间】:2016-11-07 21:58:18
【问题描述】:

我有一张表,其中一列是二进制特征数组,当该特征存在时它们就在那里。

我想在这些行上训练一个逻辑模型,但无法获得所需格式的数据,其中每个特征值都是它自己的列,值为 1 或 0。

例子:

id    feature values
1     ['HasPaws', 'DoesBark', 'CanFetch']
2     ['HasPaws', 'CanClimb', 'DoesMeow']

我想把它变成

的格式
id    HasPaws    DoesBark    CanFetch    CanClimb    DoesMeow
1     1          1           1           0           0
2     1          0           0           1           0

似乎有一些内置功能可以实现这一点,但我想不出这种转换叫什么来自己进行更好的搜索。

【问题讨论】:

    标签: python pandas dataframe logistic-regression


    【解决方案1】:

    您可以先将列表转换为列,然后使用get_dummies()方法:

    In [12]: df
    Out[12]:
       id                 feature_values
    0   1  [HasPaws, DoesBark, CanFetch]
    1   2  [HasPaws, CanClimb, DoesMeow]
    
    In [13]: (pd.get_dummies(df.set_index('id').feature_values.apply(pd.Series),
        ...:                 prefix='', prefix_sep='')
        ...:    .reset_index()
        ...: )
    Out[13]:
       id  HasPaws  CanClimb  DoesBark  CanFetch  DoesMeow
    0   1        1         0         1         1         0
    1   2        1         1         0         0         1
    

    【讨论】:

      【解决方案2】:

      另一种选择是循环遍历feature values 列,并从每个单元格构造一个序列,并将列表中的值作为索引。并且通过这种方式,pandas 会将系列扩展为一个以index 为标题的数据框:

      pd.concat([df['id'], 
                (df['feature values'].apply(lambda lst: pd.Series([1]*len(lst), index=lst))
                .fillna(0)], axis=1)
      

      【讨论】:

        【解决方案3】:

        方法一

        pd.concat([df['id'], df['feature values'].apply(pd.value_counts)], axis=1).fillna(0)
        

        方法二

        df.set_index('id').squeeze().apply(pd.value_counts).reset_index().fillna(0)
        

        方法3

        pd.concat([pd.Series(1, f, name=i) for _, (i, f) in df.iterrows()],
                  axis=1).T.fillna(0).rename_axis('id').reset_index()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-19
          • 1970-01-01
          • 2020-04-10
          • 2016-03-20
          相关资源
          最近更新 更多