【问题标题】:How to convert list of lists into a dataframe?(pandas)如何将列表列表转换为数据框?(熊猫)
【发布时间】:2022-01-19 10:17:19
【问题描述】:

我想将这些列表转换成数据框:

col1 = ['', '8465-01-446-8616', '8465-01-538-4334', '8345-01-641-8205', '8465-01-690-3107', '8465-01-526-7827', '', '', '5120-00-097-4136', '6640-00-866-1645']

col2 = [[], ['06222'], ['0N995', '12858'
], ['58367', '58367'], ['4SEN6'], ['0CCM0'], [], [], ['82523', '8BXN8'], ['1KGE8', '725Q0']]

col3 = [[], ['MODEL 703'], ['PMBS9', 'BS-9'], ['24425HBA', '37210'], ['MA66-002'], ['03485'], [], [], ['100250', '5080'], ['09-845C', '4716E20']]


col4 = [[], [''], ['AARDVARK', 'PAULSON MANUFACTURING CORPORAT
ION'], ['WILLARD MARINE, INC.', 'WILLARD MARINE, INC.'], ['CONDOR OUTDOOR PRODUCTS, INC.'], ['CASCADE DESIGNS, INC.'], [], [], ['', 'TELEFLEX LLC'], ['FISHER SCI
ENTIFIC COMPANY L.L.C.', 'THOMAS SCIENTIFIC, LLC']]

预期的数据框:

col1             col2     col3      col4

8465-01-446-8616 06222  MODEL 703   
8465-01-538-4334 0N995  PMBS9      AARDVARK
8465-01-538-4334 12858  BS-9       PAULSON MANUFACTURING CORPORATION
8345-01-641-8205 58367  24425HBA   WILLARD MARINE, INC.
8345-01-641-8205 58367  37210      WILLARD MARINE, INC.
.....................................
...................................

注意:第一行是空的,因为所有第一个元素都是空的。

【问题讨论】:

  • 你能分享你尝试过的东西吗?您期望多维嵌套列表有什么行为?
  • 在嵌套列表中,一个列表链接到col1的单个元素

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


【解决方案1】:

DataFrame 的构造函数可以采用字典 col_name -> col_values。所以你可以使用:

df = pd.DataFrame({'col1': col1, 'col2': col2, 'col3': col3, 'col4': col4})

完成此操作后,最新版本的 Pandas(>= 1.3.0,而当前为 1.3.5)允许 multi-columns explode

df = df.explode(['col2', 'col3', 'col4'])

给予:

               col1   col2       col3                               col4
0                      NaN        NaN                                NaN
1  8465-01-446-8616  06222  MODEL 703                                   
2  8465-01-538-4334  0N995      PMBS9                           AARDVARK
2  8465-01-538-4334  12858       BS-9  PAULSON MANUFACTURING CORPORATION
3  8345-01-641-8205  58367   24425HBA               WILLARD MARINE, INC.
3  8345-01-641-8205  58367      37210               WILLARD MARINE, INC.
4  8465-01-690-3107  4SEN6   MA66-002      CONDOR OUTDOOR PRODUCTS, INC.
5  8465-01-526-7827  0CCM0      03485              CASCADE DESIGNS, INC.
6                      NaN        NaN                                NaN
7                      NaN        NaN                                NaN
8  5120-00-097-4136  82523     100250                                   
8  5120-00-097-4136  8BXN8       5080                       TELEFLEX LLC
9  6640-00-866-1645  1KGE8    09-845C   FISHER SCIENTIFIC COMPANY L.L.C.
9  6640-00-866-1645  725Q0    4716E20             THOMAS SCIENTIFIC, LLC

【讨论】:

  • ValueError: column must be a scalar when using explode
  • @AtomStore:您的 Pandas 安装版本是什么?我说它需要版本>= 1.3.0
  • 1.2.5是pandas版本
  • @AtomStore 如果您可以升级,它会起作用...如果您不能,您将不得不手动进行...
  • 只需添加ignore_index=True:df.explode(['col2', 'col3', 'col4'], ignore_index=True)
【解决方案2】:

一种选择是使用sum(col1, []) 取消嵌套列表,然后将它们插入到数据框中,如下所示:

import pandas as pd

df = pd.DataFrame(
        {'col1': sum(col1, []),
         'col2': sum(col2, []),
         'col3': sum(col3, [])
        })

注意:正如在 cmets 中提出的,sum() 方法会删除空槽,如果需要保留这些空槽,您可以使用这样的列表推导而不是总和:

col1 = [v for s in col1 for v in (s or [''])]

你可以这样做:

df = pd.DataFrame(
        {'col1': col1,
         'col2': col2,
         'col3': col3
        })

如果您已对每个列表应用列表理解步骤。

【讨论】:

  • sum 删除空列表[]
  • 我的错,让我编辑我的答案以考虑到这一点
猜你喜欢
  • 2019-10-12
  • 1970-01-01
  • 2017-08-26
  • 2021-04-19
  • 2018-08-25
  • 2016-09-25
  • 2023-03-30
  • 2017-12-12
相关资源
最近更新 更多