我有一个数据帧(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
然后,当给出一些a
和b
时,我想得到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。数字化()
。如果您有任何想法来完成它或其他更好的方法,请随时回答!
在这种情况下,您可以仅使用数字进行索引:
df_value_bin.loc[(1.5, -1)]
输出(忽略值,随机生成,查看Name
):
value 0.047439
Name: ((1, 2], (-2, 0]), dtype: float64