我希望从多索引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)
答案 0 :(得分:1)
您快到了。要获得这些索引的对,您需要具有以下语法:
df.loc[[(1, 2), (2, 3)], :]
您也可以使用select_a
和select_b
进行此操作。只需确保将对作为元组传递给df.loc
。