从具有公共第一个元素的 2 个元组列表创建 Pandas DataFrame
Create Pandas DataFrame from 2 tuple lists with common first elements
我目前有 2 个元组列表,这两个列表的元组第一个元素的信息相同。我正在尝试查看是否有一种方法可以根据它们的共同元素在数据框中“加入”这两个元组列表。类似于公共列上的 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
理想情况下,我不想将单个列表的第一个元素“提取”到一个单独的列表中并将其用作第一列。我真的很想要这个“加入公共栏”的功能。原因是我不确定元组是否在每个地方都匹配,所以我希望自动处理(如 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
试试这个:
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)
我目前有 2 个元组列表,这两个列表的元组第一个元素的信息相同。我正在尝试查看是否有一种方法可以根据它们的共同元素在数据框中“加入”这两个元组列表。类似于公共列上的 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
理想情况下,我不想将单个列表的第一个元素“提取”到一个单独的列表中并将其用作第一列。我真的很想要这个“加入公共栏”的功能。原因是我不确定元组是否在每个地方都匹配,所以我希望自动处理(如 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
试试这个:
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)