python - 如何匹配两个数据框的列中的值?
问题描述
我的目标是将 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'])]
解决方案
编辑:
我通过使用将 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)
推荐阅读
- javascript - 如何在纯 Javascript 中检测 iOS 并显示横幅一次?
- sql - SQL子查询检查数据是否存在于另一个表中
- c - 我的“模糊”功能无法正常工作
- vb.net - 有人能解释一下 vb.net 中这段代码的错误在哪里吗
- python - Instapy 似乎没有点赞或评论
- c# - 是否可以使用 NPOI 将 .xls/.xlsx 作为流读取?
- sql-server-2016 - 在 SQL 中,如果没有公共 ID,如何将两个连续的行合并为一个?
- javascript - ThreeJS:如果 glTF 模型不包含纹理,则未定义着色器 UV
- python - Pandas:确定一列中的字符串是否是另一列中字符串的子字符串
- javascript - ReactJS查找数组防止返回未定义