基于多个列组合多个数据帧 匹配和求和其他列 熊猫蟒



>我目前有多个熊猫数据帧,如下所示:

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 个"输入"数据帧生成所需的数据帧。如果所有"输入"数据帧只有具有相同id1id2值对的行,则不需要后续步骤。

然后,您可以在"输入"数据帧中找到常见的id1id2对:

>>> 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

最新更新