【问题标题】:Create Pandas DataFrame from a list and list of lists从列表和列表列表创建 Pandas DataFrame
【发布时间】:2021-08-31 08:05:24
【问题描述】:

我有两个 python 列表

messages = ['message1', 'message2', 'message3']

labels = [[1,0,1,3,1], [1,1,2,0,3], [0,0,2,1,0]]

我正在创建数据框,它将 messages 作为第一列,labels 作为 cat_1, cat_2, cat_3, cat_4, cat_5 即总共 6 个列

我试过了

msgs_labels = pd.DataFrame(
{'message': messages,
 'cat': labels,
})

但它返回两列。 消息

【问题讨论】:

    标签: python python-3.x pandas list dataframe


    【解决方案1】:

    如果以0 开头的新列名没有问题,请使用DataFrame 构造函数和join

    df = pd.DataFrame({'message': messages}).join(pd.DataFrame(labels).add_prefix('cat_'))
    print (df)
        message  cat_0  cat_1  cat_2  cat_3  cat_4
    0  message1      1      0      1      3      1
    1  message2      1      1      2      0      3
    2  message3      0      0      2      1      0
    

    f = lambda x: f'cat_{x + 1}'
    df = pd.DataFrame({'message': messages}).join(pd.DataFrame(labels).rename(columns=f))
    
    print (df)
    
        message  cat_1  cat_2  cat_3  cat_4  cat_5
    0  message1      1      0      1      3      1
    1  message2      1      1      2      0      3
    2  message3      0      0      2      1      0
    

    其他一些想法:

    f = lambda x: f'cat_{x + 1}'
    df = (pd.DataFrame(labels,index=messages)
            .rename(columns=f)
            .rename_axis('messages')
            .reset_index())
    
    print (df)
       messages  cat_1  cat_2  cat_3  cat_4  cat_5
    0  message1      1      0      1      3      1
    1  message2      1      1      2      0      3
    2  message3      0      0      2      1      0
    

    或者有点疯狂:

    f = lambda x: f'cat_{x + 1}'
    df = (pd.DataFrame(labels,index=pd.Series(messages, name='messages'))
            .rename(columns=f)
            .reset_index())
    

    或先处理嵌套列表的解决方案:

    d = {f'cat_{i + 1}': x for i, x in enumerate(map(list, zip(*labels)))}
    d = {**{'message': messages}, **d}
    
    df = pd.DataFrame(d)
    print (df)
        message  cat_1  cat_2  cat_3  cat_4  cat_5
    0  message1      1      0      1      3      1
    1  message2      1      1      2      0      3
    2  message3      0      0      2      1      0
    

    【讨论】:

      【解决方案2】:

      这是一种方法:

      df = pd.DataFrame({i:j for i,j in zip(messages,labels)}).T.add_prefix('cat_').rename_axis('messages',axis=0).reset_index()
      

      【讨论】:

        【解决方案3】:

        用途:

        df=(pd.DataFrame(labels,index=messages)
           .reset_index()
           .rename(columns=lambda x:'cat_'+str(x+1) if x!='index' else 'messages'))
        

        df的输出:

            messages    cat_1   cat_2   cat_3   cat_4   cat_5
        0   message1    1       0       1       3       1
        1   message2    1       1       2       0       3
        2   message3    0       0       2       1       0
        

        【讨论】:

        • @ScottBoston - 索引名称有问题
        • 谢谢@ScottBoston 先生,但我不能在rename() 之后链接reset_index(),因为我需要重命名索引以及@jezrael 先生提到的
        • 是的。我注意到。感谢您指出。你仍然收到我的 +1
        猜你喜欢
        • 2019-08-31
        • 2015-03-09
        • 2015-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多