【问题标题】:How can I convert two lists into a dataframe, having one as a list of lists? [duplicate]如何将两个列表转换为一个数据框,其中一个作为列表列表? [复制]
【发布时间】:2021-01-08 22:58:27
【问题描述】:

我从 yml 文件中获取数据,所以我可以获得两个列表,如下所示:

其中一个名为 list_products 的列表包含产品名称:

['ABCD'
'LTAP'
'DEFG'
'FFEE']

另一个名为 list_ids,包含一个 id 列表,有时该元素可以是一个列表:

[[100, 200],
 [3333],
 [1500,99, 870],
 [2]]

仅使用 list_ids 时,我可以获得一个数据框,这是我使用的代码:

flat_list = [item for sublist in list_ids for item in sublist]
id_df = pd.DataFrame(flat_list,columns=['id'])

结果如下:

id
100
200
3333
1500
99
870
2

现在,我也想要一个带有产品名称的数据框。我想得到这个:

id       name
100      'ABCD'
200      'ABCD'
3333     'LTAP'
1500     'DEFG'
99       'DEFG'
870      'DEFG'
2        'FFEE'

【问题讨论】:

    标签: python pandas list dataframe


    【解决方案1】:
    1. 您可以使用 zip 预处理数据,然后构建 DF

      names = ['ABCD', 'LTAP', 'DEFG', 'FFEE']
      list_ids = [[100, 200], [3333], [1500, 99, 870], [2]]
      
      flat_list = [(item, name) for sublist, name in zip(list_ids, names) for item in sublist]
      id_df = pd.DataFrame(flat_list, columns=['id', 'name'])
      

      中级flat_list

      flat_list > [(100, 'ABCD'), (200, 'ABCD'), (3333, 'LTAP'), ...
      

    1. 或者用原始数据构建df,然后使用explode

      id_df = pd.DataFrame({'id': list_ids, 'name': names}).explode('id')
      

      中级pd.DataFrame({'id': list_ids, 'name': names}

                   id  name
      0       [100, 200]  ABCD
      1           [3333]  LTAP
      2  [1500, 99, 870]  DEFG
      3              [2]  FFEE
      

    【讨论】:

      【解决方案2】:

      试试explode

      l1 = ['ABCD',
      'LTAP',
      'DEFG',
      'FFEE']
      l2 = [[100, 200],
       [3333],
       [1500,99, 870],
       [2]]
      out = pd.DataFrame({'col1':l1,'col2':l2}).explode('col2')
      out
         col1  col2
      0  ABCD   100
      0  ABCD   200
      1  LTAP  3333
      2  DEFG  1500
      2  DEFG    99
      2  DEFG   870
      3  FFEE     2
      

      【讨论】:

        【解决方案3】:

        如果您不想使用explode 功能,因为它仅适用于versions > 0.25,您可以使用以下:

        In [473]: d = {i : list_ids[c] for c, i in enumerate(named_list)}
        In [474]: df_out = pd.DataFrame([(var, key) for (key, L) in d.items() for var in L], columns=['id', 'name'])
        
        In [475] df_out
        Out[475]: 
             id  name
        0   100  ABCD
        1   200  ABCD
        2  3333  LTAP
        3  1500  DEFG
        4    99  DEFG
        5   870  DEFG
        6     2  FFEE
        

        【讨论】:

          猜你喜欢
          • 2019-10-09
          • 2020-04-16
          • 2012-11-12
          • 2016-05-27
          • 1970-01-01
          • 2012-09-29
          • 1970-01-01
          • 2020-03-08
          • 1970-01-01
          相关资源
          最近更新 更多