如何通过 bin Multiindex 获取最接近的列值?

Posted

技术标签:

【中文标题】如何通过 bin Multiindex 获取最接近的列值?【英文标题】:How to get the closest the column value by the bin Multiindex? 【发布时间】:2022-01-23 19:33:20 【问题描述】:

我有一个带有 Multiindex 的 DataFrame (df_value_bin),它是分箱值,如下所示:

import pandas as pd
import numpy as np

np.random.seed(100)
df = pd.DataFrame(np.random.randn(100, 3), columns=['a', 'b', 'value'])

a_bins = np.arange(-3, 4, 1)
b_bins = np.arange(-2, 4, 2)

df['a_bins'] = pd.cut(df['a'], bins=a_bins)
df['b_bins'] = pd.cut(df['b'], bins=b_bins)
df_value_bin = df.groupby(['a_bins','b_bins']).agg('value':'mean')

这是df_value_bin的快速浏览:

                     value
a_bins   b_bins           
(-3, -2] (-2, 0] -0.417606
         (0, 2]  -0.267035
(-2, -1] (-2, 0] -0.296727
         (0, 2]  -0.112280
(-1, 0]  (-2, 0]  0.459780
         (0, 2]   0.131588
(0, 1]   (-2, 0]  0.110268
         (0, 2]   0.287755
(1, 2]   (-2, 0]  0.254337
         (0, 2]  -0.627460
(2, 3]   (-2, 0] -0.075165
         (0, 2]  -0.589709

然后,我想在给出一些ab 时得到最接近df_value_binvalue

假设 a=1.5 和 b=-1,那么我们应该得到 value=0.254337。

尝试 1

我可以为a_binsb_bins 生成布尔掩码:

a_test = 1.5
b_test = -1

boolean_a = df_value_bin.index.get_level_values('a_bins').categories.contains(a_test)
boolean_b = df_value_bin.index.get_level_values('b_bins').categories.contains(b_test)

print(boolean_a, boolean_b) # Output: [False False False False  True False] [ True False]

但是,我不知道使用掩码来选择行...

尝试 2

我可以直接获取索引:

index_a = np.digitize(a_test, a_bins, right=True)
index_b = np.digitize(b_test, b_bins, right=True)

print(index_a, index_b) # Output: 5 1

再次,我不知道如何使用索引直接选择行。

注意事项

看来第二种方法应该更快,因为它使用np.digitize()。 如果您有什么想法来完成它或其他更好的方法,请随时回答!

【问题讨论】:

【参考方案1】:

在这种情况下,您可以只使用数字进行索引:

df_value_bin.loc[(1.5, -1)]

输出(忽略值,随机生成,看Name):

value    0.047439
Name: ((1, 2], (-2, 0]), dtype: float64

【讨论】:

感谢您的出色方法!如果有人需要数组的输入,方法如下:test = np.array([-1.5, 0, 1]); df_value_bin.loc[zip(test, test)] 如果用户更喜欢使用标签,那么df_value_bin.xs((1.5, -1), level=['a_bins', 'b_bins'])满足它。

以上是关于如何通过 bin Multiindex 获取最接近的列值?的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 python 数据帧创建多级标头-尝试 Multiindex.from_product() [重复]

获取最接近的 CGFloat 值

MongoDB:如何获取包含最接近给定数字的数值的文档

如何从mysql中的数据库中获取最接近的值

如何从内联样式属性中获取值并将其放入最接近的输入值中? jQuery

如何从 C# 中的元组列表中获取最接近“a”的 4 个元素?