[英]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。 如果所有“輸入”數據幀都只有具有相同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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.