簡體   English   中英

基於多列匹配和對其他列求和組合多個數據框

[英]Combining Multiple Dataframes Based On Multiple Columns Matching And Summing Other Columns Pandas Python

我目前有多個 pandas 數據幀,如下所示:

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

我想創建一個新的 dataframe 在 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 中的連接和總和創建一個新的 dataframe?

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 個“輸入”數據幀生成了所需的 dataframe。 如果所有“輸入”數據幀都只有具有相同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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM