如何按行压缩两个元组列表?

Posted

技术标签:

【中文标题】如何按行压缩两个元组列表?【英文标题】:How to zip two lists of tuples by row? 【发布时间】:2019-06-16 00:58:39 【问题描述】:

我有两个这样的列表:

list1 = ['id':'1','id2':'2','id':'2','id2':'3']
list2 = ['fname':'a','lname':'b','fname':'c','lname':'d']

如何将列表组合成一组用于 pandas 数据框的元组?

像这样:

final_list = ['id':'1','id2':'2','fname':'a','lname':'b','id':'2','id2':'3','fname':'c','lname':'d']

数据框应如下所示:

id     id2      fname     lname
1       2         a          b
2       3         c          d 

到目前为止尝试过:

final_list = list(zip(list1,list2))

df = pd.DataFrame(final_list)

df:

0                          1
[nested_data]          [nested_data]

【问题讨论】:

到目前为止你有什么尝试? :) @IMCoins 用我尝试的方法进行了编辑 我认为问题中的术语可以为未来的用户改进。元组是一种内置的 Python 数据类型,在这个问题中不存在(您是指字典吗?还是您指的是配对数据结构?) 【参考方案1】:

你应该这样做pd.concat。

根据文档,@jpp 的答案似乎在性能方面更好。我更倾向于相信基准,但老实说,我相信pandas documentation。

import pandas as pd

df = pd.DataFrame(list1)
df2 = pd.DataFrame(list2)

result_df = pd.concat([df, df2], axis=1)

#result_df
#  id id2 fname lname
#0  1   2     a     b
#1  2   3     c     d

【讨论】:

为什么按照@jpp 的建议使用 concat vs join? @RustyShackleford, concat 可扩展为超过 2 个数据帧。如果您只有 2 个数据帧,concatjoin 或多或少是等效的(join 稍微快一点,但可能不会成为您的瓶颈)。 查看我的编辑,但是是的,他说的 + 我会说如果你追求性能,加入会更好。【参考方案2】:

“纯”Python 答案(即没有 Pandas):

[**x[0], **x[1] for x in zip(list1, list2)]

> ['id': '1', 'id2': '2', 'fname': 'a', 'lname': 'b',
    'id': '2', 'id2': '3', 'fname': 'c', 'lname': 'd']

由 Scott Boston 编辑

pd.DataFrame([**x[0], **x[1] for x in zip(list1, list2)])

输出:

  fname id id2 lname
0     a  1   2     b
1     c  2   3     d

【讨论】:

将其包装在 pd.DataFrame, pd.DataFrame([**x[0], **x[1] for x in zip(list1, list2)]) 中,您将获得 OP 预期输出。【参考方案3】:

你可以使用pd.DataFrame.join:

df = pd.DataFrame(list1).join(pd.DataFrame(list2))

print(df)

  id id2 fname lname
0  1   2     a     b
1  2   3     c     d

【讨论】:

正是我想要的!

以上是关于如何按行压缩两个元组列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将元组列表解压缩到单个列表中? [复制]

将平面列表变成两个元组[重复]

使用列表输出而不是元组进行压缩

使用列表输出而不是元组进行压缩

如何合并两个元组列表?

如何按两个元素对元组列表进行排序?