首页 > 解决方案 > 如何匹配两个数据框的列中的值?

问题描述

我的目标是将 df2 中名为“Total_studyPeriod”的列的值与 df3 中的同名列进行比较。在对列值进行匹配的情况下,我选择 df2 和 df3 的相应行并将它们写入 df4 和 df5 以便我得到两个匹配行数相等的 csv 文件。

下面是我的python代码。我正在使用isin,但没有得到想要的匹配结果,因为 df2 和 df3 的记录数不相等。假设下面是两个数据帧,应该有两个匹配的行作为基于匹配值的输出,但我得到三个,因为 6.1 匹配两次。对于所有相同的值,我想要一次。

删除重复行不会解决我的问题,因为这两个文件在其他列中包含不同的值。知道如何获得所需的结果吗?

请注意,两个数据帧的记录数不相等。

DF2
Study_name  Total_studyPeriod(mon)  Total_Reporting_Duration(mon)   
A                     11.9            11.3  
B                     6.1             10.5  
C                     6.1             10.5  
D                     13.3            10.3  


DF3
Study_name  Total_studyPeriod(mon)  Total_Reporting_Duration(mon)   
X                     13.3            13
Y                     6.1             13    
Z                     8.4             12.2  

Output:

DF4
Study_name  Total_studyPeriod(mon)  Total_Reporting_Duration(mon)   
B                     6.1             10.5  
D                     13.3            10.3  


DF5
Study_name  Total_studyPeriod(mon)  Total_Reporting_Duration(mon)   
Y                     6.1             13    
X                     13.3            13

这是我的python代码:

df1 = pd.read_csv(input_file)
df2 = df1[df1['Total_Reporting_Duration'] <= 12]
df2.to_csv('file1.csv')
df3=df1[(df1['Total_Reporting_Duration']>12)]
df3.to_csv('file2.csv')

cond =df2.loc[df2.Total_studyPeriod.isin(df3['Total_studyPeriod'])]

标签: pythonpandascsv

解决方案


编辑:

我通过使用将 df 索引更改为列,然后使用共享值进行索引来固定df5顺序。set_index'Total_studyPeriod(mon)'

这使代码复杂化,因为我们必须在之后重置索引,但我想不出如何更好地做到这一点,也许其他人有更好的答案!

import pandas as pd
import numpy as np

df2 = pd.DataFrame({
    'Study_name': {0: 'A', 1: 'B', 2: 'C', 3: 'D'},
    'Total_studyPeriod(mon)': {0: 11.9, 1: 6.1, 2: 6.1, 3: 13.3},
    'Total_Reporting_Duration(mon)': {0: 11.3, 1: 10.5, 2: 10.5, 3: 10.3},
})

df3 = pd.DataFrame({
    'Study_name': {0: 'X', 1: 'Y', 2: 'Z'},
    'Total_studyPeriod(mon)': {0: 13.3, 1: 6.1, 2: 8.4},
    'Total_Reporting_Duration(mon)': {0: 13.0, 1: 13.0, 2: 12.2},
})

matches = np.intersect1d(df2['Total_studyPeriod(mon)'], df3['Total_studyPeriod(mon)'])

#Change the dfs to be indexed by the Total_studyPeriod column
df2 = df2.set_index('Total_studyPeriod(mon)')
df3 = df3.set_index('Total_studyPeriod(mon)')


df4 = df2.loc[matches].reset_index().drop_duplicates('Total_studyPeriod(mon)')

df5 = df3.loc[matches].reset_index().drop_duplicates('Total_studyPeriod(mon)')


print(df4)

print(df5)

推荐阅读