代码之家  ›  专栏  ›  技术社区  ›  Eran Moshe

熊猫-从一个有着无数外表的动物身上得到假人

  •  1
  • Eran Moshe  · 技术社区  · 7 年前

    Pandas DataFrame() 在它里面,一些列是 Pythons' lists strings . 我想把这些列转换成“二元化”字符串并计算其外观的虚拟。

    作为一个简单的例子,我们可以看一下

    import pandas
    
    df = pd.DataFrame({"Hey":[['t1', 't2', 't1', 't3', 't1', 't3'], ['t2', 't2', 't1']]})
    
    df
    Out[54]: 
                            Hey
    0  [t1, t2, t1, t3, t1, t3]
    1              [t2, t2, t1]
    

    from sklearn.preprocessing import MultiLabelBinarizer
    mlb = MultiLabelBinarizer()
    
    pd.DataFrame(mlb.fit_transform(df['Hey']), columns=list(map(lambda x: 'Hey_' + x, mlb.classes_)))
    Out[55]: 
       Hey_t1  Hey_t2  Hey_t3
    0       1       1       1
    1       1       1       0
    

    这不计算他们的出现,但只有1发生和0缺席。我想要以下输出:

       Hey_t1  Hey_t2  Hey_t3
    0       3       1       2
    1       1       2       0
    

    他们的外表。

    3 回复  |  直到 7 年前
        1
  •  5
  •   youkaichao    7 年前

    使用 CountVectorizer list 学生:

    from sklearn.feature_extraction.text import CountVectorizer
    
    countvec = CountVectorizer()
    counts = countvec.fit_transform(df['Hey'].str.join(' '))
    df = pd.DataFrame(counts.toarray(), columns=countvec.get_feature_names())
    print (df)
       t1  t2  t3
    0   3   1   2
    1   1   2   0
    

    另一个解决方案:

    df1 = (pd.DataFrame(df['Hey'].values.tolist())
            .stack()
            .groupby(level=0)
            .value_counts()
            .unstack(fill_value=0))
    print (df1)
       t1  t2  t3
    0   3   1   2
    1   1   2   0
    

    或:

    from collections import Counter
    
    df1 = (pd.DataFrame([Counter(x) for i, x in df['Hey'].iteritems()], index=df.index)
            .fillna(0).astype(int))
    print (df1)
       t1  t2  t3
    0   3   1   2
    1   1   2   0
    
        2
  •  1
  •   cs95 abhishek58g    7 年前

    Counter 基于备选方案:

    from collections import Counter
    df = (pd.DataFrame([Counter(x) for i, x in df['Hey'].items()], index=df.index)
            .fillna(0, downcast='infer'))
    df
       t1  t2  t3
    0   3   1   2
    1   1   2   0
    
        3
  •  0
  •   youkaichao    7 年前

    我想你有个误会 sklearn.preprocessing.MultiLabelBinarizer . 因为它被称为二值化器,所以它计算一个键是否发生。也就是说,该值是二值化的:如果发生键,则为1,否则为0。不算发生的事。