合并两个具有聚合列值的数据框作为结果
Posted
技术标签:
【中文标题】合并两个具有聚合列值的数据框作为结果【英文标题】: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 来实现这个结果!!! (优化的解决方案是可观的)
【问题讨论】:
【参考方案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... 我更新了我的答案,看看吧! 您的代码将仅添加列 region1 和 region2,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)
。以上是关于合并两个具有聚合列值的数据框作为结果的主要内容,如果未能解决你的问题,请参考以下文章