提问者:小点点

如何通过bin多重索引获得与列值最接近的值?


我有一个数据帧(df_value_bin),带有多索引,它是bined值,如下所示:

import pandas as pd

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\u value\u bin的快速视图:

                     value
a_bins   b_bins           
(-3, -2] (-2, 0]       NaN
         (0, 2]        NaN
(-2, -1] (-2, 0]  0.516331
         (0, 2]   0.248542
(-1, 0]  (-2, 0] -0.129625
         (0, 2]   0.515010
(0, 1]   (-2, 0] -0.075501
         (0, 2]  -0.491606
(1, 2]   (-2, 0]  0.071409
         (0, 2]   0.203766
(2, 3]   (-2, 0]  0.130304
         (0, 2]        NaN

然后,当给出一些ab时,我想得到df\u value\u bin的最接近的值。

假设a=1.5,b=-1,那么我们应该得到值=0.071409。

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]

但是,我不知道如何使用遮罩来选择行。。。

我可以直接获取索引:

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。数字化()。如果您有任何想法来完成它或其他更好的方法,请随时回答!


共1个答案

匿名用户

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

df_value_bin.loc[(1.5, -1)]

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

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