【问题标题】:Convert list of repeated column names and list of values into a dataframe将重复列名列表和值列表转换为数据框
【发布时间】:2021-08-21 01:00:37
【问题描述】:

假设我有两个列表。一个包含重复的标题列表。一个包含值。请参见下面的示例:

cols = ['col1', 'col2', 'col3', 'col1', 'col2', 'col3']
values = [1, 3, 4, 6, 7, 1]

我如何从这样的结构中创建一个数据框,该结构具有三列('col1'、'col2'、'col3')和两行。

想要的结果

'col1', 'col2', 'col3'
1,3,4
6,7,1

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以尝试将values 转换为系列,然后将cols 上的groupby 和agg 转换为列表,最后转换为数据帧并转置

    s = pd.Series(values).groupby(cols).agg(list)
    pd.DataFrame.from_dict(s.to_dict())
    

       col1  col2  col3
    0     1     3     4
    1     6     7     1
    

    或者使用默认字典:

    from collections import defaultdict
    d = defaultdict(list)
    for k,v in zip(cols,values):
            d[k].append(v)
    pd.DataFrame.from_dict(d)
    

    【讨论】:

      【解决方案2】:

      假设 colsvalues 被简单地重复(使两个结构化列表都具有固定的顺序和对齐操作是不需要的),我们可以简单地将 values 转换为 arrayreshape 基于 @987654323 @列值:

      import pandas as pd
      import numpy as np
      
      cols = ['col1', 'col2', 'col3', 'col1', 'col2', 'col3']
      values = [1, 3, 4, 6, 7, 1]
      
      # Unique Col Values
      u_cols = np.unique(cols)
      # Build DataFrame
      df = pd.DataFrame(
          np.array(values).reshape(-1, len(u_cols)),
          columns=u_cols
      )
      

      df:

         col1  col2  col3
      0     1     3     4
      1     6     7     1
      

      或作为 csv:

      df.to_csv('output.csv', index=False, quotechar="'", quoting=2)
      

      output.csv:

      'col1','col2','col3'
      1,3,4
      6,7,1
      

      【讨论】:

        【解决方案3】:

        试试:

        import csv
        
        
        cols = ["col1", "col2", "col3", "col1", "col2", "col3"]
        values = [1, 3, 4, 6, 7, 1]
        
        df = (
            pd.DataFrame(zip(cols, values))
            .pivot(columns=0, values=1)
            .apply(sorted, key=pd.isna)
            .dropna()
        )
        print(df.to_csv(index=False, quotechar="'", quoting=csv.QUOTE_NONNUMERIC))
        

        打印:

        'col1','col2','col3'
        1.0,3.0,4.0
        6.0,7.0,1.0
        
        

        【讨论】:

          【解决方案4】:

          您可以将事物转换为字典,然后从键中访问值

          cols = ['col1', 'col2', 'col3', 'col1', 'col2', 'col3']
          values = [1, 3, 4, 6, 7, 1]
          
          the_dict = {
              key: [x[1] for x in zip(cols, values) if x[0] == key] 
              for key in set(cols)
          }
          
          print(the_dict)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-26
            • 2020-05-31
            • 2013-01-27
            相关资源
            最近更新 更多