【问题标题】:Search for value within a range in a pandas dataframe?在熊猫数据框中搜索范围内的值?
【发布时间】:2017-01-16 23:56:33
【问题描述】:

我正在尝试在 pandas 数据框中的给定不确定性范围内搜索匹配值。例如,如果我有一个数据框:

    A     B        C
0   12  12.6    111.20
1   14  23.4    112.20
2   16  45.6    112.30
3   18  56.6    112.40
4   27  34.5    121.60
5   29  65.2    223.23
6   34  45.5    654.50
7   44  65.6    343.50

如何搜索与 112.6 +/-0.4 匹配的值,而无需创建冗长且困难的条件,例如:

TargetVal_Max= 112.6+0.4
TargetVal_Min= 112.6-0.4

基本上,我想创建一个“缓冲窗口”,允许返回与窗口匹配的所有值。我有不确定性包,但还没有让它像这样工作。

理想情况下,我希望能够在给定的错误范围内返回与 C 和 B 中的值匹配的所有索引值。

编辑

正如@MaxU 所指出的,如果您知道确切的数字,则 np.isclose f(x) 效果很好。但是是否可以匹配一个值列表,例如,如果我有第二个数据帧并想查看一个数据帧中的 C 中的值是否在容差范围内与 C (第二个数据帧)的值匹配?我试图将它们放入一个列表并以这种方式进行操作,但是在尝试一次处理多个值时遇到问题。

TEST= Dataframe_2["C"]
HopesNdreams = sample[sample["C"].apply(np.isclose,b=TEST, atol=1.0)]

编辑 2

通过尝试几种不同的解决方法,我发现我可以做到:

TEST1= Dataframe_2["C"].tolist
for i in TEST1:
    HopesNdreams= sample[sample["C"].apply(np.isclose,b=i, atol=1.0)]

这将返回给定列的命中。使用第一个答案中提出的逻辑,我认为这对于我需要的效果非常好。有没有我用这种方法看不到的挂断?

干杯并感谢您的帮助!

【问题讨论】:

    标签: python database pandas dataframe uncertainty


    【解决方案1】:

    IIUC你可以使用np.isclose()函数:

    In [180]: df[['B','C']].apply(np.isclose, b=112.6, atol=0.4)
    Out[180]:
           B      C
    0  False  False
    1  False   True
    2  False   True
    3  False   True
    4  False  False
    5  False  False
    6  False  False
    7  False  False
    
    In [181]: df[['B','C']].apply(np.isclose, b=112.6, atol=0.4).any(1)
    Out[181]:
    0    False
    1     True
    2     True
    3     True
    4    False
    5    False
    6    False
    7    False
    dtype: bool
    
    In [182]: df[df[['B','C']].apply(np.isclose, b=112.6, atol=0.4).any(1)]
    Out[182]:
        A     B      C
    1  14  23.4  112.2
    2  16  45.6  112.3
    3  18  56.6  112.4
    

    【讨论】:

    • 非常感谢@MaxU!但是,有没有办法可以匹配值列表?这样 b = 来自另一个数据帧的系列而不是单个数字;找到一个接近该系列中的值的数字?我尝试将其作为从系列生成的列表和 df 列名并得到“不可散列的类型:'numpy.ndarray'”
    【解决方案2】:

    使用Series.between():

    df['C'].between(112.6 + .4, 112.6 - .4)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 2021-06-15
      • 2018-10-10
      • 1970-01-01
      • 2022-07-12
      • 2018-05-12
      • 2018-02-21
      相关资源
      最近更新 更多