我已经创建了2个Pandas数据帧,如果行基于2个列变量匹配,我需要将DF1中的每一行与DF2中的每一行进行比较.基本上,我需要将DF2中的每一行与DF1中的第一行进行比较;将DF2中的每一行与DF1中的第二行进行比较,以此类推,如果它们具有相同的参与者编号和相同的试验编号.
通过"比较",我的意思是我每次都需要执行一次计算,然后如果结果值小于一个特定的数字,我需要知道我们在DF2的哪一行,并将其记录在一个新的列中.
我对Pandas 非常陌生,所以我不太确定从哪里开始,但我已经在下面详细介绍了我的问题的逐步逻辑.
以下是我的两个数据帧(样本--实际数据帧将非常大;每个数据帧超过10,000行):
DF1:
IP_INDEX | IP_LABEL | PARTICIPANT | TRIAL | CURRENT_FIX_INDEX | PRE_FIX_X | PRE_FIX_Y |
---|---|---|---|---|---|---|
1 | 1st 3 Seconds | a | 1 | 1 | 550 | 150 |
1 | 1st 3 Seconds | a | 1 | 2 | 600 | 300 |
1 | 1st 3 Seconds | a | 2 | 1 | 250 | 600 |
1 | 1st 3 Seconds | b | 1 | 1 | 400 | 400 |
1 | 1st 3 Seconds | b | 2 | 1 | 600 | 400 |
DF2:
IP_INDEX | IP_LABEL | PARTICIPANT | TRIAL | CURRENT_FIX_INDEX | POST_FIX_X | POST_FIX_Y |
---|---|---|---|---|---|---|
2 | 2nd 3 Seconds | a | 1 | 1 | 500 | 200 |
2 | 2nd 3 Seconds | a | 1 | 2 | 650 | 350 |
2 | 2nd 3 Seconds | a | 2 | 1 | 300 | 650 |
2 | 2nd 3 Seconds | b | 1 | 1 | 250 | 700 |
2 | 2nd 3 Seconds | b | 1 | 2 | 450 | 150 |
2 | 2nd 3 Seconds | b | 2 | 1 | 550 | 350 |
2 | 2nd 3 Seconds | b | 2 | 2 | 350 | 550 |
以下是将我的2个CSV文件导入到这些数据帧中的代码:
import pandas as pd
import os, math
import numpy as np
#change directory to where the file is
mycsvdir = os.chdir('C:/Users/Elisabeth/Desktop/Test/Output/CSV/')
#import csv file into dataframe
df1 = pd.read_csv('1st 3 Seconds.csv')
df2 = pd.read_csv('2nd 3 Seconds Full.csv')
从编程的Angular 来看,这基本上就是我迷路的地方.从逻辑的Angular 来看,以下是我需要的(任何给定行的示例):
A.在df1中创建一个名为‘refix’的新列.此字段目前为空,但稍后将根据下面的公式填充单元格. B.如果DF2‘Participant’=DF1‘Participant and DF2’Trial‘=DF1’Trial‘,则计算math.dist(p,q),其中p和q由DF1和DF2的*_FIX_X和*_FIX_Y值定义(**代表基于DF1或DF2的Pre或Post). B.2.如果DF2‘Participant’!=DF1‘Participant’or DF2‘Trial’!=DF1‘Trial’,则移至DF2中的下一行 C.如果math.dist(p,q)<;的结果=150,则用DF2中的CURRENT_FIX_INDEX(我们在DF2中所在行)的值填充DF1中的‘REFIX’列(对于我们在DF1中所在的行). D.将DF1另存为新的CSV文件
我不确定我在这里是否正确,但以下是我用来确定math.dist(p,q)函数的p和q值的方法:
#define p and q values for distance calculation
p = [(df1['PRE_FIX_X']), (df1['PRE_FIX_Y'])]
q = [(df2['POST_FIX_X']), (df2['POST_FIX_Y'])]
根据给定的示例数据帧,完整的DF1文件如下所示:
IP_INDEX | IP_LABEL | PARTICIPANT | TRIAL | CURRENT_FIX_INDEX | PRE_FIX_X | PRE_FIX_Y | REFIX |
---|---|---|---|---|---|---|---|
1 | 1st 3 Seconds | a | 1 | 1 | 550 | 150 | 1 |
1 | 1st 3 Seconds | a | 1 | 2 | 600 | 300 | 1,2 |
1 | 1st 3 Seconds | a | 2 | 1 | 250 | 600 | 1 |
1 | 1st 3 Seconds | b | 1 | 1 | 400 | 400 | |
1 | 1st 3 Seconds | b | 2 | 1 | 600 | 400 | 1 |