pandas:按照二级索引的范围为MultiIndex分配值

时间:2016-09-15 10:04:17

标签: pandas

我在向Pandas数据帧的切片分配类似对象的系列时遇到问题。 也许我没有按照预期的方式使用Datafarme,因此非常感谢一些启发。 我已经阅读了以下文章:

http://jsfiddle.net/7zpggvLe/1/

pandas: slice a MultiIndex by range of secondary index

据我所知,我用一个.loc调用唤起切片的方式确保我没有得到数据的副本。显然原始数据帧也会被改变,但是我得到NaN值而不是预期的数据。 请参阅附加的代码snipet。

我是否必须为我想要更改的每个值迭代数据帧的所需部分并使用.set_value(row_idx,col_idx,val)方法?

亲切的问候和提前谢谢

马库斯

In [1]: import pandas as pd

In [2]: mindex = pd.MultiIndex.from_product([['one','two'],['first','second']])

In [3]: dfmi = pd.DataFrame([list('abcd'),list('efgh'),list('ijkl'),list('mnop')],
   ...:                     index = mindex, columns=(['X','Y','Z','Q']))

In [4]: print(dfmi)
            X  Y  Z  Q
one first   a  b  c  d
    second  e  f  g  h
two first   i  j  k  l
    second  m  n  o  p

In [5]: dfmi.loc[('two',slice('first','second')),'X']
Out[5]: 
two  first     i
     second    m
Name: X, dtype: object

In [6]: substitute = pd.Series(data=["ab","cd"], index= mindex.levels[1])
   ...: print(substitute)
first     ab
second    cd
dtype: object

In [7]: dfmi.loc[('two',slice('first','second')),'X'] = substitute

In [8]: print(dfmi)
              X  Y  Z  Q
one first     a  b  c  d
    second    e  f  g  h
two first   NaN  j  k  l
    second  NaN  n  o  p

2 个答案:

答案 0 :(得分:1)

正在发生的事情是substitute有一个索引,用于确定值的位置,而dfmi.loc[('two',slice('first','second')),'X']也指定了这样的位置。

在分配过程中,pandas试图对齐两个索引,因为它们不匹配(如果substitute也是多索引,它们会一样),对齐的结果都是NA,它会被插入。

解决办法可能是删除substitute的索引,因为loc已经指定了要插入值的位置:

dfmi.loc[('two',slice('first','second')),'X'] = substitute.values

甚至更简单,直接插入值:

dfmi.loc[('two',slice('first','second')),'X'] = ["ab","cd"]

答案 1 :(得分:0)

你可以试试这个:

dfmi.loc [' 2'] [' X'] =替代