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

2024-06-02 06:47:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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的行相加,以创建一个新的数据帧,该数据帧基于表中的连接和总和


2条回答

首先,可以连接数据帧:

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

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"])
)

相关问题 更多 >