【问题标题】:How to make a binary pandas matrix with words in a list?如何用列表中的单词制作二进制熊猫矩阵?
【发布时间】:2019-05-06 07:14:48
【问题描述】:

我有一个数据框,其中有一列包含每一行的列表:

df['list1'][0] = ['a','b','c','d']

df['list1'][1] = [,'b','c','d', 'e']

现在我想从中创建一个二进制矩阵,将字母作为列名,如果该行上的列表包含该字母,则为 1,如果不是 0。我找不到解决方案。有人可以帮帮我吗?

【问题讨论】:

    标签: python pandas matrix


    【解决方案1】:

    如果性能很重要,请使用MultiLabelBinarizer: :

    df = pd.DataFrame({'list1':[ ['a','b','c','d'], ['b','c','d', 'e']]})
    print (df)
              list1
    0  [a, b, c, d]
    1  [b, c, d, e]
    
    from sklearn.preprocessing import MultiLabelBinarizer
    
    mlb = MultiLabelBinarizer()
    df1 = pd.DataFrame(mlb.fit_transform(df['list1']),columns=mlb.classes_)
    

    get_dummiesDataFrame 构造函数:

    df1 = (pd.get_dummies(pd.DataFrame(df['list1'].values.tolist()), prefix_sep='', prefix='')
             .max(level=0, axis=1))
    

    另一种解决方案,但如果大数据使用Series.str.joinSeries.str.get_dummies 会很慢:

    df1 = df['list1'].str.join('|').str.get_dummies()
    

    print (df1)
       a  b  c  d  e
    0  1  1  1  1  0
    1  0  1  1  1  1
    

    编辑:如果需要删除 list1 列的原始列,请使用 DataFrame.pop 提取带有 DataFrame.join 的列:

    df = pd.DataFrame({'list1':[ ['a','b','c','d'], ['b','c','d', 'e']],
                       'col1':[1,2],
                       'col2':list('XY')})
    print (df)
              list1  col1 col2
    0  [a, b, c, d]     1    X
    1  [b, c, d, e]     2    Y
    
    from sklearn.preprocessing import MultiLabelBinarizer
    
    mlb = MultiLabelBinarizer()
    df1 = pd.DataFrame(mlb.fit_transform(df.pop('list1')),columns=mlb.classes_, index=df.index)
    print (df1)
       a  b  c  d  e
    0  1  1  1  1  0
    1  0  1  1  1  1
    

    df1 = (pd.get_dummies(pd.DataFrame(df.pop('list1').values.tolist()), prefix_sep='', prefix='')
             .max(level=0, axis=1))
    

    df1 = df.pop('list1').str.join('|').str.get_dummies()
    

    df = df.join(df1)
    print (df)
       col1 col2  a  b  c  d  e
    0     1    X  1  1  1  1  0
    1     2    Y  0  1  1  1  1
    

    【讨论】:

    • 谢谢!不幸的是,现在我丢失了数据框的其他数据:df['name'] 和 df['title]。有没有办法让 df['list1'] 成为一个二进制矩阵,其中 df['name'] 和 df['title] 仍在数据框中?
    • @Jan - 你能改变我的数据df = pd.DataFrame({'list1':[ ['a','b','c','d'], ['b','c','d', 'e']]}) 与预期输出的另一列吗?
    • 我的意思是这样我会丢失数据框中其他列的数据
    • @Jan - 给他们一点时间。
    • @Jan - 您需要删除原始的list1 列吗?
    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2022-06-11
    • 2016-08-26
    • 1970-01-01
    • 2015-09-23
    • 2023-01-09
    • 2021-12-15
    • 2016-07-29
    相关资源
    最近更新 更多