分配新值以削减 MultiIndex DataFrame

我想从我的列中更改一些值 DataFrame. 目前我有

看法

的 select 通过我原来的多端
df

/而变化真的变化了
df

/.

这是一个例子:


In [1]: arrays = [np.array/['bar', 'bar', 'baz', 'qux', 'qux', 'bar']/,
np.array/['one', 'two', 'one', 'one', 'two', 'one']/,
np.arange/0, 6, 1/]
In [2]: df = pd.DataFrame/randn/6, 3/, index=arrays, columns=['A', 'B', 'C']/

In [3]: df
A B C
bar one 0 -0.088671 1.902021 -0.540959
two 1 0.782919 -0.733581 -0.824522
baz one 2 -0.827128 -0.849712 0.072431
qux one 3 -0.328493 1.456945 0.587793
two 4 -1.466625 0.720638 0.976438
bar one 5 -0.456558 1.163404 0.464295


我正试图改变削减
df

意思 scalar:


In [4]: df.ix['bar', 'two', :]['A']
Out[4]:
1 0.782919
Name: A, dtype: float64

In [5]: df.ix['bar', 'two', :]['A'] = 9999
# df is unchanged


我真的想改变

一些

列中的值 /由于索引返回向量,而不是值 scalar, 我认为它会有更多的意义/:


In [6]: df.ix['bar', 'one', :]['A'] = [999, 888]
# again df remains unchanged


我用 pandas 0.11. 有一种简单的方法吗?

目前的解决方案是重新创建 df 从新的并改变我想要的值。 但它不优雅,复杂可能很难 dataframe. 在我看来,问题必须来自 .ix 和 .loc, 返回不是视图,而是副本。
已邀请:

风见雨下

赞同来自:

排序帧,然后选择/使用媒体皮质安装它


In [12]: df = pd.DataFrame/randn/6, 3/, index=arrays, columns=['A', 'B', 'C']/

In [13]: df
Out[13]:
A B C
bar one 0 -0.694240 0.725163 0.131891
two 1 -0.729186 0.244860 0.530870
baz one 2 0.757816 1.129989 0.893080
qux one 3 -2.275694 0.680023 -1.054816
two 4 0.291889 -0.409024 -0.307302
bar one 5 1.697974 -1.828872 -1.004187

In [14]: df = df.sortlevel/0/

In [15]: df
Out[15]:
A B C
bar one 0 -0.694240 0.725163 0.131891
5 1.697974 -1.828872 -1.004187
two 1 -0.729186 0.244860 0.530870
baz one 2 0.757816 1.129989 0.893080
qux one 3 -2.275694 0.680023 -1.054816
two 4 0.291889 -0.409024 -0.307302

In [16]: df.loc[/'bar','two'/,'A'] = 9999

In [17]: df
Out[17]:
A B C
bar one 0 -0.694240 0.725163 0.131891
5 1.697974 -1.828872 -1.004187
two 1 9999.000000 0.244860 0.530870
baz one 2 0.757816 1.129989 0.893080
qux one 3 -2.275694 0.680023 -1.054816
two 4 0.291889 -0.409024 -0.307302


例如,如果指定完整索引,您也可以在不排序的情况下执行此操作


In [23]: df.loc[/'bar','two',1/,'A'] = 999

In [24]: df
Out[24]:
A B C
bar one 0 -0.113216 0.878715 -0.183941
two 1 999.000000 -1.405693 0.253388
baz one 2 0.441543 0.470768 1.155103
qux one 3 -0.008763 0.917800 -0.699279
two 4 0.061586 0.537913 0.380175
bar one 5 0.857231 1.144246 -2.369694


检查排序深度


In [27]: df.index.lexsort_depth
Out[27]: 0

In [28]: df.sortlevel/0/.index.lexsort_depth
Out[28]: 3


您的问题的最后一部分,与名单约会 /请注意,您必须拥有
您尝试更换时的物品数量/, 还有这个 MUST 必须分类以确保它的工作


In [12]: df.loc[/'bar','one'/,'A'] = [999,888]

In [13]: df
Out[13]: 
                    A         B         C
bar one 0  999.000000 -0.645641  0.369443
        5  888.000000 -0.990632 -0.577401
    two 1   -1.071410  2.308711  2.018476
baz one 2    1.211887  1.516925  0.064023
qux one 3   -0.862670 -0.770585 -0.843773
    two 4   -0.644855 -1.431962  0.232528

要回复问题请先登录注册