【发布时间】:2022-01-15 22:50:39
【问题描述】:
上下文
假设我有一个多索引数据框,如下所示:
import numpy as np
import pandas as pd
arrays = [
["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],
["one", "two", "one", "two", "one", "two", "one", "two"],
]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=["first", "second"])
data = np.array([
[1, 2],
[3, 4],
[5, 6],
[7, 8],
[9, 10],
[11, 12],
[13, 14],
[15, 16],
])
df = pd.DataFrame(data, index=index, columns=('a', 'b'))
看起来像这样:
a b
first second
bar one 1 2
two 3 4
baz one 5 6
two 7 8
foo one 9 10
two 11 12
qux one 13 14
two 15 16
我想将第一级索引bar 的列a 的值复制到第一级索引qux 的同一列中,与索引的第二级对齐(这里称为second)。换句话说,我想从上面的数据帧中获取以下数据帧:
a b
first second
bar one 1 2
two 3 4
baz one 5 6
two 7 8
foo one 9 10
two 11 12
qux one 1 14 # <-- column a changed to match first = bar for second = one
two 3 16 # <-- column a changed to match first = bar for second = two
根据对this 问题的回答,我理解我可以通过将pd.IndexSlice 与.loc 和.values 结合使用来完成此操作,如下所示:
df.loc[pd.IndexSlice['qux', :], 'a'] = df.loc[pd.IndexSlice['bar', :], 'a'].values
我不喜欢这样(也许/可能不合理),因为我不清楚这些值是否会总是在第二个索引级别上对齐:
问题:
我能否保证上述分配(使用.values访问)将始终在多索引的第二级对齐?
如果没有,有没有办法实现我想要实现的目标?
【问题讨论】:
-
“在第二个索引级别对齐”是什么意思?
-
在上面的例子中,我很想知道上面通过
loc访问的切片是否总是被排序为one,two(在multi-指数)。一般来说,我很想知道这是否适用于类似问题的两个级别以上的值。 -
不,它不会对齐,因为通过使用
.values(顺便说一句,.to_numpy()已弃用),您会删除所有索引/列信息。 -
我认为真正的问题是“我怎样才能做出始终在多索引的第二级对齐的分配?”
-
谢谢两位。我确实怀疑是这种情况(因此提出了问题)。我对@hpchavaz 描述的问题感兴趣。
标签: python pandas dataframe multi-index