首页 > 解决方案 > 如何在保留信息的同时加入多个事件的表?

问题描述

所以我有一个用例,其中我有几个表,其中包含时间序列中不同类型的事件,以及另一个包含基本信息的表。事件具有不同的类型,具有不同的列,例如,“婚姻”事件可以具有“丈夫姓名”和“妻子姓名”列,“工作”事件表可以具有“受雇时间”和“受雇时间”列“开火”,但也可以有“丈夫的名字”。基本信息表不是时间序列数据,并且包含“案例 ID”和“案例城市”之类的内容。

目标是 1. 将所有不同的时间序列表放在一个包含所有可能列的表中,只要列中没有数据,就可以使用 NaN。并且 2. 时间序列中的所有条目都应具有基础数据表中的所有可用数据。

例如:

df = pd.DataFrame(np.array([['Dave', 1,'call'], ['Josh', 2, 'rejection'], ['Greg', 3,'call']]), columns=['husband name', 'casenum', 'event'])
df2 = pd.DataFrame(np.array([['Dave', 'Mona', 1, 'new lamp'], ['Max', 'Lisa',1, 'big increase'],['Pete', 'Esther',3,'call'], ['Josh', 'Moana', 2, 'delivery']]), columns=['husband name','wife name','casenum', 'event'])
df3 = pd.DataFrame(np.array([[1, 'new york'],[3,'old york'], [2, 'york']]), columns=['casenum','city'])

我正在尝试连接:

concat = pd.concat([df, df2, df3])

在此处输入图像描述

这不起作用,因为我们已经知道对于第 1 个案例,城市是“纽约”

我正在尝试加入:

innerjoin = pd.merge(df, df2, on='casenum', how='inner')
innerjoin = pd.merge(innerjoin, df3, on='casenum', how='inner')

在此处输入图像描述

这也是不对的,因为我想记录两个表中的所有事件。此外,有趣的是,虚拟数据上的内部和外部联接的结果是相同的,但是,在我的实际数据上,内部联接导致比两个事件表的总和更多的行,我不太清楚理解。

基本上,我想要的结果是:

    husband name    casenum   event        wife name    city
0   Dave            1         call         NaN          new york
1   Josh            2         rejection    NaN          york
2   Greg            3         call         NaN          old york
0   Dave            1         new lamp     Mona         new york
1   Max             1         big increase Lisa         new york
2   Pete            3         call         Esther       old york
3   Josh            2         delivery     Moana        york

我尝试过内连接、外连接、连接,但似乎都不起作用。也许我只是太累了,但我需要做什么才能得到这个输出?谢谢!

标签: pythonpandasjoinmerge

解决方案


我认为您可以使用外部选项合并两次:

(df.merge(df2,on=['husband name', 'casenum', 'event'], how='outer')
   .merge(df3, on='casenum')
)

输出:

  husband name casenum         event wife name      city
0         Dave       1          call       NaN  new york
1         Dave       1      new lamp      Mona  new york
2          Max       1  big increase      Lisa  new york
3         Josh       2     rejection       NaN      york
4         Josh       2      delivery     Moana      york
5         Greg       3          call       NaN  old york
6         Pete       3          call    Esther  old york

推荐阅读