python - 如何在保留信息的同时加入多个事件的表?
问题描述
所以我有一个用例,其中我有几个表,其中包含时间序列中不同类型的事件,以及另一个包含基本信息的表。事件具有不同的类型,具有不同的列,例如,“婚姻”事件可以具有“丈夫姓名”和“妻子姓名”列,“工作”事件表可以具有“受雇时间”和“受雇时间”列“开火”,但也可以有“丈夫的名字”。基本信息表不是时间序列数据,并且包含“案例 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
我尝试过内连接、外连接、连接,但似乎都不起作用。也许我只是太累了,但我需要做什么才能得到这个输出?谢谢!
解决方案
我认为您可以使用外部选项合并两次:
(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
推荐阅读
- amazon-web-services - 删除 s3 存储桶文件夹中的文件
- angular - 将角度从 9 升级到 12
- ckeditor - 转换 Word 样式以在 CKE v5 样式菜单中使用
- python - 如何在 while 循环中使用函数,直到获得想要的结果?
- php - 有人能弄清楚为什么这个 jQuery 正在运行 else 吗?
- python - 使用 pandas.read_csv 读取 csv 时,parse_dates 不起作用
- c++ - 从文件读取几个字节到结构所需的保证
- sql - SQL Server unpivot 或 cross apply 处理空值和多列
- excel - 使用 VBA 脚本将全名解析为部分
- node.js - “dotnet new react”不允许我使用 sass 文件