如何匹配两个数据框的列中的值?

时间:2020-10-22 19:30:13

标签: python pandas csv

我的目标是将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'])]

1 个答案:

答案 0 :(得分:0)

编辑:

我通过使用df5将df索引更改为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)