从两个具有共同第一元素的元组列表创建Pandas DataFrame



我目前有两个元组列表,它们在元组的第一个元素上具有相同的信息。我想看看是否有一种方法可以"加入"数据框架中的这两个元组列表基于它们的公共元素。在公共列上执行类似SQL JOIN的操作。

列表是这样的:

listA = [(0, A), (1, B), (2, C)]
listB = [(0, G), (1, H), (2, I)]

,我想要实现的是一个看起来像这样的数据帧:

Col1  Col2  Col3
0      A     G
1      B     H
2      C     I

理想情况下,我不想"提取"将单个列表的第一个元素转换为单独的列表,并将其用作第一列。我真的希望这个"公共列上的Join"功能。原因是我不确定元组匹配的每一个地方,所以我希望它被自动照顾(像在SQL)。

试试这个,

代码:

import pandas as pd
l1 = [(0, 'A'), (1, 'B'), (2, 'C')]
l2 = [(0, 'G'), (1, 'H'), (2, 'I')]
ur_lists = [l1, l2]
list_of_dfs = [pd.DataFrame(data, columns=['key', f'col{idx}']) 
for idx, data in enumerate(ur_lists)]
dfs = [df.set_index('key') for df in list_of_dfs]
pd.concat(dfs, axis=1).reset_index()

输出:

key col0 col1    
0   A   G
1   B   H
2   C   I

TRY THIS:

import pandas as pd
listA = [(0, 'A'), (1, 'B'), (2, 'C')]
listB = [(0, 'G'), (1, 'H'), (2, 'I')]
df = pd.DataFrame({"COL": [x[0] for x in listA], "COL2": [x[1] for x in listA]})
df2 = pd.DataFrame({"COL": [x[0] for x in listB], "COL3": [x[1] for x in listB]})
print(df)
print(df2)
t = df.join(df2.set_index('COL'), on='COL')
print(t)

您可以构建一个嵌套字典并使用它构建单个DataFrame,而不是构建多个DataFrame并进行连接:

df = pd.DataFrame({f"Col{i}": dict(c) for i,c in enumerate([listA, listB], 2)}).rename_axis('Col1').reset_index()

输出:

Col1 Col2 Col3
0     0    A    G
1     1    B    H
2     2    C    I

这样会更快。如果您有许多列表,则差异将更加明显:

>>> ur_lists = [listA, listB]
>>> %timeit df = pd.DataFrame({f"Col{i}": dict(c) for i,c in enumerate(ur_lists, 2)}).rename_axis('Col1').reset_index()
1.05 ms ± 36.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
>>> %timeit list_of_dfs = [pd.DataFrame(data, columns=['key', f'col{idx}']) for idx, data in enumerate(ur_lists)]; dfs = [df.set_index('key') for df in list_of_dfs]; df = pd.concat(dfs, axis=1).reset_index()
2.76 ms ± 180 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)