如何将列表列表转换为数据框?(熊猫)
Posted
技术标签:
【中文标题】如何将列表列表转换为数据框?(熊猫)【英文标题】: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
的单个元素
【参考方案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 删除空列表[]
我的错,让我编辑我的答案以考虑到这一点以上是关于如何将列表列表转换为数据框?(熊猫)的主要内容,如果未能解决你的问题,请参考以下文章