我已经创建了2个Pandas嵌套框,我需要通过一个2列距离函数将DF 1中的行与DF 2中的行进行比较。
基本上,我需要DF 2中的每一行都与DF 1中的第1行进行比较;将DF 2中的每一行与DF 1中的第2行进行比较,等等,前提是它们具有相同的受试者编号和相同的试验编号。如果得到的距离值小于特定的阈值,我需要在新列中记录来自DF 2的行。
我对Pandas非常陌生,所以我不太确定从哪里开始,但我在下面详细介绍了我的问题的一步一步的逻辑。
这里是我的2个框架(样本-实际的框架将非常大; 10,000+行):
DF1:
| IP_索引|IP_标签|参与者|审判|CURRENT_FIX_INDEX| PRE_FIX_X|修复前Y|
| --|--|--|--|--|--|--|
| 1 |第一个3秒|一| 1 | 1 | 550 | 150 |
| 1 |第一个3秒|一| 1 | 2 | 600 | 300 |
| 1 |第一个3秒|一| 2 | 1 | 250 | 600 |
| 1 |第一个3秒|B| 1 | 1 | 400 | 400 |
| 1 |第一个3秒|B| 2 | 1 | 600 | 400 |
DF2:
| IP_索引|IP_标签|参与者|审判|CURRENT_FIX_INDEX| POST_FIX_X| POST_FIX_Y|
| --|--|--|--|--|--|--|
| 2 |第二个3秒|一| 1 | 1 | 500 | 200 |
| 2 |第二个3秒|一| 1 | 2 | 650 | 350 |
| 2 |第二个3秒|一| 2 | 1 | 300 | 650 |
| 2 |第二个3秒|B| 1 | 1 | 250 | 700 |
| 2 |第二个3秒|B| 1 | 2 | 450 | 150 |
| 2 |第二个3秒|B| 2 | 1 | 550 | 350 |
| 2 |第二个3秒|B| 2 | 2 | 350 | 550 |
以下是我需要的(任何给定行的示例):
1.在DF 1中创建一个名为“REFIX”的新列。这将是空白的,但单元格将根据下面的公式填写。
1.如果DF 2“参与者”== DF 1“参与者 * 且 * DF 2”试验“== DF 1”试验“,
1.然后计算math.dist(p,q),其中p和q由DF 1和DF 2的 _FIX_X和 _FIX_Y值定义( 代表PRE或POST,取决于它是DF 1还是DF 2)。
1.否则( 即如果DF 2“参与者”!= DF 1“参与者”* 或 * DF 2“试验”!= DF 1 'TRIAL')*,然后移到DF 2中的下一行
1.如果math.dist(p,q)的结果<= 150,则在DF 1中的“REFIX”列(对于我们在DF 1中的行)中填充DF 2中的CURRENT_FIX_INDEX的值(对于我们在DF 2中的行)
1.保存DF 1作为新的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'])]
基于给出的示例框架,一个完整的DF 1文件看起来像这样:
| IP_索引|IP_标签|参与者|审判|CURRENT_FIX_INDEX| PRE_FIX_X|修复前Y|重新固定|
| --|--|--|--|--|--|--|--|
| 1 |第一个3秒|一| 1 | 1 | 550 | 150 | 1 |
| 1 |第一个3秒|一| 1 | 2 | 600 | 300 |一二|
| 1 |第一个3秒|一| 2 | 1 | 250 | 600 | 1 |
| 1 |第一个3秒|B| 1 | 1 | 400 | 400 ||
| 1 |第一个3秒|B| 2 | 1 | 600 | 400 | 1 |
2条答案
按热度按时间sc4hvdpw1#
你的问题看起来很复杂,有点难以理解,但我认为这可能是你想要的?
我不认为用嵌套的if语句迭代两个df是最有效的方法,但我现在想不出更好的选择:)
第1部分:加载您提供的数据:(你显然可以忽略这一点,但为了便于再现性/测试,把它放进去:
第二部分:计算:
我使用你提供的输入得到的输出:
| IP_索引|IP_标签|参与者|审判|CURRENT_FIX_INDEX| PRE_FIX_X|修复前Y|重新固定|REFIX/试验/受试者|
| --|--|--|--|--|--|--|--|--|
| 1 |第一个3秒|一| 1 | 1 | 550 | 150 | 1 | 3 |
| 1 |第一个3秒|一| 1 | 2 | 600 | 300 |一二| 3 |
| 1 |第一个3秒|一| 2 | 1 | 250 | 600 | 1 | 1 |
| 1 |第一个3秒|B| 1 | 1 | 400 | 400 || 0 |
| 1 |第一个3秒|B| 2 | 1 | 600 | 400 | 1 | 1 |
ldioqlga2#
merge
两个 Dataframe1.计算距离
1.当距离小于150时指定
REFIX
1.将
REFIX
化为字符串以进行聚合groupby
和agg
以获得所需的输出