【问题标题】:Merging two data frames with aggregated columns values as result合并两个具有聚合列值的数据框作为结果
【发布时间】:2021-12-12 22:51:05
【问题描述】:

数据帧 1

{'id': [1, 2, 3], 'dept': [101, 102, 103]}

id  dept    ....
1   101     ....  
2   102     ....
3   103     ....

数据帧 2

{'id': [1, 1, 5], 'region1': ['CUD', 'DAS', 'ITF'], 'region2': ['IOP', 'POL', 'IJK' ]}

id  region1 region2 ...
1   CUD     IOP     ...
1   DAS     POL     ...
5   ITF     IJK     ...

Result 数据框应如下所示

id      dept    concatinated
1       101     [{region1: 'CUD', region2: 'IOP'},{region1: 'DAS', region2: 'POL', ...}]
2       102     []
3       103     []
null    null    [{region1: 'ITF'}, {region2: 'IJK'}, ...]

注意:数据框 1 和 2 的列是动态的,期望 id(可以有 N 列) 有没有办法使用 pandas 或 NumPy 来实现这个结果!!! (优化的解决方案是可观的)

【问题讨论】:

    标签: pandas dataframe numpy group-by pandas-groupby


    【解决方案1】:
    df2['region_comb'] = df2.apply(lambda row: {col: row[col] for col in df2.columns}, axis=1, result_type='reduce')
    df2 = df2.groupby('fid')['region_comb'].apply(list).reset_index(name='merged')
    result_df = pd.merge(df2, df1, left_on='fid', right_on='fid', how='outer')
    

    解决方案有效!!!

    【讨论】:

    • result_df 这里与您问题中的预期数据框不同。我认为你的问题并不清楚。无论如何。如果你找到了你想要的答案,我很高兴。
    【解决方案2】:

    我的解决方案似乎有点复杂,我不确定是否有简单的方法。

    import pandas as pd
    import numpy as np
    df1 = pd.DataFrame({'id': [1, 2, 3 ,2 ,6], 'dept': [101, 102, 103 ,104,106]})
    df2 = pd.DataFrame({'id': [1, 1, 5, 7], 'region1': ['CUD', 'DAS', 'ITF', "CUD"], 'region2': ['IOP', 'POL', 'IJK',"IOP"]})
    
    df=df1.merge(df2,how="outer")
    df["concatinated"] = df.apply(lambda x:{"region1":x.region1,"region2":x.region2},axis=1)
    df=df.groupby(["id","dept"],dropna=False).apply(lambda x:[i for i in x.concatinated if pd.notna(i["region1"])]).reset_index()
    df=df[(~df.id.duplicated()) | (df['id'].isnull())]
    df.loc[~df.id.isin(df1.id),"id"] = np.nan
    df=df.rename(columns={0:"concatinated"})
    df
    
          id    dept    concatinated
    0    1.0    101.0   [{'region1': 'CUD', 'region2': 'IOP'}, {'regio...
    1    2.0    102.0   []
    3    3.0    103.0   []
    4    NaN    NaN     [{'region1': 'ITF', 'region2': 'IJK'}]
    5    6.0    106.0   []
    6    NaN    NaN     [{'region1': 'CUD', 'region2': 'IOP'}]
    

    【讨论】:

    • 是的,有点复杂。再添加一个条件,如果我不知道第二个数据帧的列怎么办,就像我不能说它总是 region1 和 region2...
    • 我更新了我的答案,看看吧!
    • 您的代码将仅添加列 region1region2,df1 和 df2 可能有 N 个列,我无法在其中添加所有列名代码对吗?
    • 我扩展了您的示例数据并再次更新了我的代码,请再试一次!
    • 非常感谢您的回答,谢谢,但是df["concatinated"] = df.apply(lambda x:{"region1":x.region1,"region2":x.region2},axis=1) 我的原始 df2 中有 75 列,所以我无法添加您提到的所有列名称,如 region1、region2。我的第一个数据框中有 136 列,我不能像这样将它们全部分组df=df.groupby(["id","dept"],dropna=False)
    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2016-10-19
    相关资源
    最近更新 更多