连接两个数据框,同时将两个相同的列合并为一个

时间:2021-05-17 18:57:39

标签: python pandas dataframe join

我正在尝试通过购买组 ID 键连接两个数据帧。第一个数据框包含购买组中每个客户的购买组代码、客户 ID 和开始/结束日期。
头部看起来像:

Buying_group, Customer_ID, BG_Start_Dt, BG_End_Dt
123           0001         2020-1-1     2025-1-1      
123           0002         2021-1-1     2024-1-1      
132           0033         2019-1-1     2023-1-1
132           0044         2019-1-1     2023-1-1

另一个包含采购组代码、合同编号、客户 ID 和合同的开始/结束日期。
头部看起来像:

Buying_group, Contract, ContractStDt, ContractEnDt, Customer_ID 
123           1             2020-1-1      2025-1-1      0001
123           2             2021-1-1      2024-1-1      0002
156           4             2019-1-1      2023-1-1      0003
156           4             2019-1-1      2023-1-1      0004

我正在尝试加入每个 df,所以我有一个主 df,它结合了第一个 df 的购买组日期。我遇到的问题是,当我通过 Buying_group 键对两个 df 进行外部或内部连接时,生成的 df 有两列客户 ID:

Customer_IDx, Customer_IDy

数据框如下所示:

Buying_group, Contract, ContractStDt, ContractEnDt, BG_Start_Dt, BG_End_Dt Customer_IDx, Customer_IDy 
123           1             2020-1-1      2025-1-1  2020-1-1     2025-1-1     0001        0001
123           2             2021-1-1      2024-1-1  2021-1-1     2024-1-1     0002        0002
156           4             2019-1-1      2023-1-1  2022-1-1     2029-1-1     null        0003
156           4             2019-1-1      2023-1-1  2022-1-1     2029-1-1     null        0004
132           5             2019-1-1      2023-1-1  2019-1-1     2023-1-1     0033        null
132           5             2019-1-1      2023-1-1  2019-1-1     2023-1-1     0044        null

这里的问题是每一行都对应于每个客户的一个唯一合同,合并后的数据框需要为每个唯一的客户 ID 分配一行。我对这些 SQL 类型连接真的很陌生,想知道是否有办法做到这一点。将每个加入的 DF 的两个客户 ID 列合并为一列,同时保留其唯一行。我尝试进行内连接和外连接,但结果相同。

理想的数据框应该是这样的:

Buying_group, Contract, ContractStDt, ContractEnDt, BG_Start_Dt, BG_End_Dt, Customer_ID 
123           1             2020-1-1      2025-1-1  2020-1-1     2025-1-1    0001       
123           2             2021-1-1      2024-1-1  2021-1-1     2024-1-1    0002        
156           4             2019-1-1      2023-1-1  2022-1-1     2029-1-1    0003
156           4             2019-1-1      2023-1-1  2022-1-1     2029-1-1    0004
132           5             2019-1-1      2023-1-1  2019-1-1     2023-1-1    0033        
132           5             2019-1-1      2023-1-1  2019-1-1     2023-1-1    0044        

1 个答案:

答案 0 :(得分:1)

试试这个

df_3 = pd.concat([df1,df2]).drop_duplicates(subset=['Buying_group','Customer_ID'], 
                                            keep="last").reset_index(drop=True)
df_3

输出

    Buying_group    Customer_ID BG_Start_Dt BG_End_Dt   contract
0   132                00033    2019-1-1    2023-1-1    NaN
1   132                00044    2019-1-1    2023-1-1    NaN
2   123                0001     2020-1-1    2025-1-1    1.0
3   123                0002     2021-1-1    2024-1-1    2.0
4   156                0003     2019-1-1    2023-1-1    4.0
5   156                0004     2019-1-1    2023-1-1    4.0