使用多索引在 pandas DataFrame 上设置值
Posted
技术标签:
【中文标题】使用多索引在 pandas DataFrame 上设置值【英文标题】:Setting values on pandas DataFrame with multiindex 【发布时间】:2018-08-02 04:32:05 【问题描述】:以下是我正在尝试做的一个最小示例。我有一个带有 multiindex 的 pandas DataFrame,如下所示
import pandas as pd
import numpy as np
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'])
s = pd.DataFrame(np.random.randn(8,2), index=index)
所以我拥有的DataFrame是
0 1
first second
bar one -3.174428 -0.314160
two 0.968316 0.278967
baz one 0.171292 -0.789257
two 1.420621 0.100964
foo one -1.001074 -0.517729
two -0.211823 0.951422
qux one 1.173289 0.313692
two -0.159855 0.149710
我想要的是将索引“秒”等于 2 的所有观察值设置为 -1。我想到的是使用.loc,如下所示:
s.loc[(:,'two')]
但 .loc 不接受 ":" 运算符。
有人可以帮忙吗?
【问题讨论】:
【参考方案1】:选项 1:
In [127]: s.loc[pd.IndexSlice[:, 'two'], :] = -1
In [128]: s
Out[128]:
0 1
first second
bar one -0.581647 0.225254
two -1.000000 -1.000000
baz one 0.705050 -1.414695
two -1.000000 -1.000000
foo one 0.359795 1.468521
two -1.000000 -1.000000
qux one -0.481149 -0.241922
two -1.000000 -1.000000
选项 2:
In [137]: s.loc[(slice(None),'two'), :] = -11
In [138]: s
Out[138]:
0 1
first second
bar one 2.144487 0.024400
two -11.000000 -11.000000
baz one -0.177128 -1.088566
two -11.000000 -11.000000
foo one -0.780979 2.701814
two -11.000000 -11.000000
qux one -0.981635 -0.202875
two -11.000000 -11.000000
【讨论】:
感谢回复,但是第一种方法不行。我不知道您使用的是哪个版本,但最新版本返回 KeyError 消息。第二种方法有效,但语法似乎很复杂。我想如果没有更好的选择,我会使用第二种方法。 @user3821012,我使用的是pandas: 0.22.0
,我更喜欢第二个选项,因为它更清晰(对我来说)......
正如第一种方法的结果所示,它没有返回所需的结果——“二”的值没有改变。
如果你使用"s.loc[(None, 'two'), :]",它会返回错误。
@user3821012,我没有收到任何错误消息...请发布您想要的数据集以上是关于使用多索引在 pandas DataFrame 上设置值的主要内容,如果未能解决你的问题,请参考以下文章