>我目前有多个熊猫数据帧,如下所示:
df1
id1 id2 col_sum_1 col_sum_2
0 13 15 3 4
1 15 234 7 6
2 63 627 1 7
df2
id1 id2 col_sum_1 col_sum_2
0 13 15 8 3
1 15 234 2 3
2 63 627 8 1
df3
id1 id2 col_sum_1 col_sum_2
0 13 15 3 5
1 15 234 7 7
2 63 627 4 4
我想从这些数据帧创建一个新的数据帧,当 id1 和 id2 匹配时,我加入这些数据帧。然后将col_sum_1和col_sum_2相加,得到以下结果
df
id1 id2 col_sum_1 col_sum_2
0 13 15 14 12
1 15 234 16 16
2 63 627 13 12
有没有办法连接 id1 相等且 id2 相等的 3 个表,然后将 col_sum_1 和col_sum_2的行相加,以创建一个基于 pandas 中的连接和总和的新数据帧?
merge()
所有三个数据框,然后sum(axis=1)
(跨行)。 最后清理列。
df1 = pd.read_csv(io.StringIO(""" id1 id2 col_sum_1 col_sum_2
0 13 15 3 4
1 15 234 7 6
2 63 627 1 7
"""), sep="s+")
df2 = pd.read_csv(io.StringIO(""" id1 id2 col_sum_1 col_sum_2
0 13 15 8 3
1 15 234 2 3
2 63 627 8 1"""), sep="s+")
df3 = pd.read_csv(io.StringIO(""" id1 id2 col_sum_1 col_sum_2
0 13 15 3 5
1 15 234 7 7
2 63 627 4 4"""), sep="s+")
(
df1.merge(df2, on=["id1","id2"])
.merge(df3, on=["id1","id2"])
.assign(col_sum_1=lambda dfa: dfa.loc[:,[c for c in dfa.columns if "col_sum_1" in c]].sum(axis=1),
col_sum_2=lambda dfa: dfa.loc[:,[c for c in dfa.columns if "col_sum_2" in c]].sum(axis=1),
)
.drop(columns=["col_sum_1_x","col_sum_2_x","col_sum_1_y","col_sum_2_y"])
)
首先,您可以连接数据帧:
>>> df = pd.concat([df1, df2, df3]).groupby(['id1', 'id2']).sum().reset_index()
>>> df
id1 id2 col_sum_1 col_sum_2
0 13 15 14 12
1 15 234 16 16
2 63 627 13 12
注意:以上为问题中的 3 个"输入"数据帧生成所需的数据帧。如果所有"输入"数据帧只有具有相同id1
和id2
值对的行,则不需要后续步骤。
然后,您可以在"输入"数据帧中找到常见的id1
和id2
对:
>>> common_pairs = set(zip(df1.id1, df1.id2)) & set(zip(df2.id1, df2.id2)) & set(zip(df3.id1, df3.id2))
>>> common_pairs
{(63, 627), (13, 15), (15, 234)}
最后,您可以创建一个MultiIndex
并使用它来仅保留具有common_pairs
的行:
>>> idx = pd.MultiIndex.from_frame(df[['id1', 'id2']])
>>> df = df.loc[idx.isin(common_pairs)].reset_index(drop=True)
>>> df
id1 id2 col_sum_1 col_sum_2
0 13 15 14 12
1 15 234 16 16
2 63 627 13 12