使用数组以从多索引中选择值

时间:2019-07-06 07:24:43

标签: python pandas dataframe multi-index

我希望从多索引DataFrame中提取值,该df有两个索引,a_idx和b_idx。要提取的值为(1,1)

[in] df.loc[(1, 1), :]
[out] 0
Name: (1, 1), dtype: int64

这是预期的。但是,如果我想获得两个值(1,2)和(2,3):

[in] df.loc[([1, 2], [2, 3]), :]
[out]
        value
a_idx   b_idx   
1   2   1
3   6
2   2   3
3   9

这不是我想要的,我需要特定的对,而不是4个值。

此外,我希望从该数据库中选择具有两个数组select_a和select_b:.loc [[的元素,它们的长度彼此相同,但不与数据帧相同。所以对于

select_a = [1, 1, 2, 2, 3]
select_b = [1, 3, 2, 3, 1]

我的要旨是我应该使用:

df.loc[(select_a, select_b), :]

,然后使用a_idx==select_a[i] and b_idx==select_b[i] for all i in len(select_a)接收所有项目的列表。

我尝试了xs和slice索引,但是没有返回期望的结果。我使用索引方法的主要原因是因为计算速度快,因为实际的数据集实际上是430万行,必须创建的数据集将更多。

如果这不是获得此结果的最佳方法,请指出正确的方向。也欢迎任何来源,我在pandas文档中发现的内容并不适合这种索引编制(或者至少我找不到)

使用以下代码创建数据框:

numbers = pd.DataFrame(np.random.randint(0,10,10), columns=["value"])
numbers["a"] = [1, 1, 1, 1, 2, 2, 2, 3, 3, 3]
numbers["b"] = [1, 2, 3, 4, 1, 2, 3, 1, 2, 3]
print("before adding the index to the dataframe")
print(numbers)
index_cols = pd.MultiIndex.from_arrays(
        [numbers["a"].values, numbers["b"].values],
        names=["a_idx", "b_idx"])
df = pd.DataFrame(numbers.values,
       index=index_cols,
       columns=numbers.columns.values)
df = df.sort_index()
df.drop(columns=["a","b"],inplace=True)
print("after adding the indexes to the dataframe")
print(df)

1 个答案:

答案 0 :(得分:1)

您快到了。要获得这些索引的对,您需要具有以下语法:

df.loc[[(1, 2), (2, 3)], :]

您也可以使用select_aselect_b进行此操作。只需确保将对作为元组传递给df.loc