合并两个具有聚合列值的数据框作为结果

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... 我更新了我的答案,看看吧! 您的代码将仅添加列 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)

以上是关于合并两个具有聚合列值的数据框作为结果的主要内容,如果未能解决你的问题,请参考以下文章

合并具有多索引和列值的数据框

根据 Pandas 中的公共列值合并两个数据框

合并两个共享相同列值的数据框

合并两个具有共同值的熊猫数据框,这些数据框在一个数据框中显示为列,而在另一个数据框中显示为行

Pandas:合并具有不同索引和缺失值的两个数据框

如何匹配和合并两个具有完全不同值的数据框,数据框列中的数字除外?