基于多列值映射值和合并数据框

Posted

技术标签:

【中文标题】基于多列值映射值和合并数据框【英文标题】:Mapping values and merging dataframes based on multiple column values 【发布时间】:2018-01-19 16:42:24 【问题描述】:

我有以下数据框:

df1:带有患者重要注释的数据框

AREA                      DATE_TIME                 CRITICAL ISSUE NOTES
0013                      11/6/2017 2:25:00 P.M     Nurse attended to the patient 
1121                      10/23/2017 6:43:00 A.M    Completed an ER
1121                      10/2/2017 9:30:00 P.M     Admitted 

df2:患者其他详细信息

ZIP                TIME_NOTED   NAME    OCCUPIED    STATE
4568    10/1/2017 10:04:00 A.M  Chris          Y    NORMAL
1121    10/23/2017 6:43:00 A.M  Nancy          Y    CRITICAL
1121    10/2/2017 9:30:00 P.M   Derek          N    CRITICAL

我必须使用 df1 中的 DATE_TIME 和 AREA 代码映射 df2 中的记录,并保留两个数据框中的所有其他列。我尝试合并多个列,但没有按预期工作。

new_df = pd.merge(df1, df2,  how='right', left_on=['Date_Time','AREA'], right_on = ['ZIP','TIME_NOTED'])

【问题讨论】:

尝试merge 时遇到的错误是什么。什么是 ENS? 看起来right_on 应该是['TIME_NOTED', 'ZIP'] 才有机会匹配left_on... @JonClements 的意思是您需要检查您的 right_on 和 left_on 列表的顺序。要么将日期列放在两个列表的第一位,要么放在两个列表的第二位。目前,right_on 与 left_on 不匹配,无法进行合并。 @ScottBoston 尝试更改顺序。它显示合并后df1中所有列的空值 请在您的问题中添加 df1.to_dict() 和 df2.to_dict() 的输出。 【参考方案1】:

如果您将 left/right_on 的列以相同的顺序放置(区域/zip,然后注明日期时间/时间),它应该可以工作。我还将合并更改为内部,因此您只需获得具有相同 zip/区域和日期时间/时间的记录。

new_df = pd.merge(df1, df2,  how='inner', left_on = ['AREA','DATE_TIME'], right_on = ['ZIP','TIME_NOTED'])

另一个潜在的解决方案是创建一个“ID”列并在其上合并。

df1['ID'] = df1['AREA'].astype(str) + '_' + df1['DATE_TIME'].astype(str)
df2['ID'] = df2['ZIP'].astype(str) + '_' + df2['TIME_NOTED'].astype(str)

现在合并 ID

new_df = pd.merge(df1, df2, how = 'inner',left_on = ['ID'], right_on = ['ID'])

这应该产生相同的表(添加了一个 ID 列)。

【讨论】:

how = 'inner' 结果中的记录为零。并且由于某种原因,在重新排序列之后,它仍然不适用于how ='right'。即使在所有这些讨论之后,我还是很好奇修复会多么简单。 你是如何创建数据框的?因为在复制上面的 df 示例并使用 pd.read_clipboard(sep='\s\s+') 重新创建数据框后,合并对我来说正常工作。 从 csv 文件中读取。我已经检查了我们需要合并的所有列的数据类型,它们是相等的。 intdatetime64[ns] 奇怪,一定是dtype问题。日期似乎不是典型的日期时间格式。您是否尝试过 ID 解决方法?或者可能尝试对列单独执行 .astype() 以明确指定所需的 dtype。

以上是关于基于多列值映射值和合并数据框的主要内容,如果未能解决你的问题,请参考以下文章

基于两个数据帧中的多列将值从一个映射到另一个df

基于具有列表值的多列删除数据框中的重复行[重复]

基于多列值的具有重复键的两个大型 Pandas DataFrame 的条件合并/连接 - Python

如何基于两列组合两个数据框? [复制]

基于值的多列选择

如何合并同一数据框的多列