python - 使用数组从多重索引中选择值

标签 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 和切片索引,但这没有返回所需的结果。我采用索引方法的主要原因是计算速度,因为真实数据集实际上有 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)

最佳答案

你就快到了。要获取这些索引对,您需要使用如下语法:

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

您还可以使用 select_aselect_b 来执行此操作。只需确保将这些对作为元组传递给 df.loc 即可。

关于python - 使用数组从多重索引中选择值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56912072/

相关文章:

python - Pandas 数据帧 : create new ID variable based on number of modalities of an existing one

python - 连接两个具有不同索引级别数的 MultiIndex DataFrame

python - 从 py2exe 程序 : Unable to acquire Oracle environment handle 连接到 Oracle 时出错

python - 为什么 Django 不迁移我改变的模型?

python - Pandas 数据框中列中最接近的不相等行

python - 从另一个数据帧的列组成一个数据帧

python - 增加 Pandas 中数据框的列

python - 在 pandas 数据框中重复行

python - 使用 django 和 REST-api 获取 salesforce.com access_token

python - 线性规划(Simplex LP)PuLP?