【问题标题】:Take multiple lists into dataframe将多个列表放入数据框中
【发布时间】:2015-08-11 21:58:20
【问题描述】:

如何获取多个列表并将它们作为不同的列放入 python 数据框中?我尝试了this solution,但遇到了一些问题。

尝试 1:

  • 有三个列表,将它们压缩在一起并使用res = zip(lst1,lst2,lst3)
  • 只产生一列

尝试 2:

percentile_list = pd.DataFrame({'lst1Tite' : [lst1],
                                'lst2Tite' : [lst2],
                                'lst3Tite' : [lst3] }, 
                                columns=['lst1Tite','lst1Tite', 'lst1Tite'])
  • 产生一行 3 列(上述方式),或者如果我转置它是 3 行 1 列

如何获得 100 行(每个独立列表的长度)乘 3 列(三个列表)的 pandas 数据框?

【问题讨论】:

    标签: python numpy pandas


    【解决方案1】:

    我想你快到了,尝试删除 lst 周围的额外方括号(另外,当你从这样的字典创建数据框时,你不需要指定列名):

    import pandas as pd
    lst1 = range(100)
    lst2 = range(100)
    lst3 = range(100)
    percentile_list = pd.DataFrame(
        {'lst1Title': lst1,
         'lst2Title': lst2,
         'lst3Title': lst3
        })
    
    percentile_list
        lst1Title  lst2Title  lst3Title
    0          0         0         0
    1          1         1         1
    2          2         2         2
    3          3         3         3
    4          4         4         4
    5          5         5         5
    6          6         6         6
    ...
    

    如果您需要更高性能的解决方案,您可以在第一次尝试时使用 np.column_stack 而不是 zip,这在此处的示例中具有大约 2 倍的速度提升,但在我看来,这是以可读性为代价的:

    import numpy as np
    percentile_list = pd.DataFrame(np.column_stack([lst1, lst2, lst3]), 
                                   columns=['lst1Title', 'lst2Title', 'lst3Title'])
    

    【讨论】:

    • 是 np.column_stack 视图,还是复制数据。 (如果是复制的话,这似乎效率更高(O(1),而不是 O(n))。
    • @maxymoo 列名可以自动设置为列表名吗?
    • 如果列表的数据类型不同,numpy 列堆栈就不能正常工作
    【解决方案2】:

    在此处添加Aditya Guru 的答案。不需要使用地图。你可以简单地做到这一点:

    pd.DataFrame(list(zip(lst1, lst2, lst3)))
    

    这会将列的名称设置为 0,1,2。要设置自己的列名,可以将关键字参数columns 传递给上述方法。

    pd.DataFrame(list(zip(lst1, lst2, lst3)),
                  columns=['lst1_title','lst2_title', 'lst3_title'])
    

    【讨论】:

    • 在 Python 3.8 和 Pandas 1.0 中,我们不需要使用 list 函数,因为 DataFrame 需要一个可迭代对象,而 zip() 返回一个可迭代对象。所以,pd.DataFrame(zip(lst1, lst2, lst3)) 也应该这样做。
    【解决方案3】:

    添加一个更具可扩展性的解决方案。

    lists = [lst1, lst2, lst3, lst4]
    df = pd.concat([pd.Series(x) for x in lists], axis=1)
    

    【讨论】:

    • 你能解释一下吗?
    • 您垂直加入(concat)系列(axis = 1)以从列表列表中创建DataFrame
    【解决方案4】:

    只需添加使用第一种方法即可完成 -

    pd.DataFrame(list(map(list, zip(lst1,lst2,lst3))))
    

    【讨论】:

      【解决方案5】:

      除了上面的答案,我们可以动态创建

      df= pd.DataFrame()
      list1 = list(range(10))
      list2 = list(range(10,20))
      df['list1'] = list1
      df['list2'] = list2
      print(df)
      

      希望对你有帮助!

      【讨论】:

        【解决方案6】:

        有多种方法可以从多个列表创建数据框。

        list1=[1,2,3,4]
        list2=[5,6,7,8]
        list3=[9,10,11,12]
        
        1. pd.DataFrame({'list1':list1, 'list2':list2, 'list3'=list3})

        2. pd.DataFrame(data=zip(list1,list2,list3),columns=['list1','list2','list3'])

        【讨论】:

          【解决方案7】:

          @oopsi 使用了pd.concat(),但没有包含列名。您可以执行以下操作,与已接受答案中的第一个解决方案不同,它可以让您控制列顺序(避免无序的字典):

          import pandas as pd
          lst1 = range(100)
          lst2 = range(100)
          lst3 = range(100)
          
          s1=pd.Series(lst1,name='lst1Title')
          s2=pd.Series(lst2,name='lst2Title')
          s3=pd.Series(lst3 ,name='lst3Title')
          percentile_list = pd.concat([s1,s2,s3], axis=1)
          
          percentile_list
          Out[2]: 
              lst1Title  lst2Title  lst3Title
          0           0          0          0
          1           1          1          1
          2           2          2          2
          3           3          3          3
          4           4          4          4
          5           5          5          5
          6           6          6          6
          7           7          7          7
          8           8          8          8
          ...
          

          【讨论】:

            【解决方案8】:

            您可以简单地使用以下代码

            train_data['labels']= train_data[["LABEL1","LABEL1","LABEL2","LABEL3","LABEL4","LABEL5","LABEL6","LABEL7"]].values.tolist()
            train_df = pd.DataFrame(train_data, columns=['text','labels'])
            

            【讨论】:

              猜你喜欢
              • 2021-09-23
              • 2020-03-23
              • 1970-01-01
              • 1970-01-01
              • 2013-02-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多