Pandas 熊猫:如何合并在一定公差范围内匹配的两个数据帧列的值?

Pandas 熊猫:如何合并在一定公差范围内匹配的两个数据帧列的值?,pandas,Pandas,我试图将pandas数据框中包含正数据和负数据的两组行匹配到用户定义的公差范围内,例如(最初): (创建时使用: df = pd.DataFrame({'timestamp': range(9), 'value': [36, 68, 131, 94, -1000, 100, 540, -100, 54]}) 加号在减号中可能有或可能没有一个(或多个)匹配项。如果加号在公差范围内没有匹配项,则相应的加号行必须将其列的“has a_matching_减号”设置为真(否则仍为假) 我知道我可以使用

我试图将
pandas
数据框中包含正数据和负数据的两组行匹配到用户定义的
公差范围内,例如(最初):

(创建时使用:

 df = pd.DataFrame({'timestamp': range(9), 'value': [36, 68, 131, 94, -1000, 100, 540, -100, 54]})
加号
减号
中可能有或可能没有一个(或多个)匹配项。如果加号在公差范围内没有匹配项,则相应的
加号行
必须将其列
的“has a_matching_减号”
设置为
(否则仍为

我知道我可以使用
df.between(low,high)
,但它只将
low
high
作为标量,而不是系列/数据帧列

对于
在之间的循环,我如何避免以下(慢!)
?我应该使用
合并等吗

import numpy as np
import pandas as pd

minuses=data[data['value']<0.0]
plusses=data[data['value']>0.0]

tolerance = 10.0
match_queries      = np.abs(minusses)
match_queries_high = match_queries + tolerance
match_queries_low  = match_queries - tolerance

plusses['has_a_matching_minus'] = False
for (l, h) in zip(match_queries_low, match_queries_high):
    in_range = plusses['value'].between(l,h).astype(np.bool)
    plusses['has_a_matching_minus'] = plusses['has_a_matching_minus'] | in_range

assert(plusses['has_a_matching_minus']==plusses['should_match_tolerance_equals_ten'].all()), 'The acid test'
将numpy导入为np
作为pd进口熊猫
减数=数据[数据['value']0.0]
公差=10.0
匹配查询=np.abs(减数)
匹配查询高=匹配查询+容差
匹配查询低=匹配查询-容差
加号['has_a_匹配_减号']=False
对于zip中的(l,h)(匹配查询低,匹配查询高):
in_range=plus['value'].between(l,h).astype(np.bool)
加号['has_a_matching_minus']=加号['has_a_matching_minus']]
断言(加号['has_a_匹配_减号]==加号['should_匹配_公差_等于_ten'].all()),'acid测试'

我不确定我是否100%了解了这个问题的细节,但下面可能会介绍如何解决这个问题

假设你从

df = pd.DataFrame({'timestamp': range(9), 'value': [36, 68, 131, 94, -1000, 100, 540, -100, 54]})
使用虚拟列执行自外部联接:

df['dummy'] = 1
merged = pd.merge(df, df, on='dummy', how='outer')
现在,计算每个时间戳,是否有一个不同的负值,最多与绝对值不同,最多相距10:

merged['has_a_matching_minus'] = (merged.timestamp_x != merged.timestamp_y) & (merged.value_y < 0) & ((merged.value_x.abs() - merged.value_y.abs()).abs() < 10)

>>> merged.has_a_matching_minus.astype(int).groupby(merged.timestamp_x).max().astype(bool).to_frame()


has_a_matching_minus
timestamp_x 
0   False
1   False
2   False
3   True
4   False
5   True
6   False
7   False
8   False
merged['has_a_matching_minus']=(merged.timestamp_x!=merged.timestamp_y)&(merged.value_y<0)&(merged.value_x.abs()-merged.value_y.abs()).abs()<10)
>>>merged.has_a_匹配_减号.astype(int).groupby(merged.timestamp_x).max().astype(bool).to_frame()
有匹配的负号吗
时间戳
0错误
1错误
2错误
3正确
4错误
5对
6错误
7错误
8错误

您可以轻松地
merge
将其合并到原始帧中。如果您需要多个列,请在
merged
上以类似方式执行它们的计算。

您可以添加一些具有预期输出的数据样本吗?@jezrael谢谢-完成-但出于某种原因,此问题无法解决:(向下投票人:请提供建设性的反馈:-如果可以的话,SI会将您的测试数据创建行添加到OP中。我实际上在这一行中遇到了问题-我们是否有机会在聊天中讨论它?除非我找不到聊天button@jtlz2嘿,我不确定你在评论中的意思(“来个菜鸟”?).你可以编辑你的问题或开始一个新的问题吗?顺便说一句,我不知道为什么这一个被否决得如此严重。(来个剪短者=来个脱臼者=搞砸了=变得困惑了=倒下了?:)
merged['has_a_matching_minus'] = (merged.timestamp_x != merged.timestamp_y) & (merged.value_y < 0) & ((merged.value_x.abs() - merged.value_y.abs()).abs() < 10)

>>> merged.has_a_matching_minus.astype(int).groupby(merged.timestamp_x).max().astype(bool).to_frame()


has_a_matching_minus
timestamp_x 
0   False
1   False
2   False
3   True
4   False
5   True
6   False
7   False
8   False