更改Pandas MultiIndex DataFrame中的特定列值

时间:2014-05-02 01:10:46

标签: python pandas multi-index

考虑我们有以下数据框

myDF = DataFrame(np.random.randn(4,2), index= [[1,1,2,2],['Mon','Tue','Mon','Tue']])
myDF

             0           1
1   Mon -0.910930    1.592856
    Tue -0.167228   -0.763317
2   Mon -0.926121   -0.718729
    Tue  0.372288   -0.417337

如果我想更改索引1中所有行的第一列的值,我尝试这样做:

myDF.ix[1,:][0] = 99

但是这不起作用并且返回相同的DataFrame不变。我错过了什么 谢谢

2 个答案:

答案 0 :(得分:3)

当你尝试这样的事情时,最新版本的pandas会发出警告。例如,在版本0.13.1上,您可以得到:

In [4]: myDF.ix[1,:][0] = 99
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead

你所做的事情被称为chained assignment,并且由于大熊猫所依赖的numpy内部运作的细微之处而失败。

由于你有一个MultiIndex,你的情况比一般警告所解决的情况更复杂。要选择外层和标签1中标签为0的所有行,请使用.loc[1, 0]。 (另见this answer。)

In [5]: myDF.loc[1, 0] = 99

In [6]: myDF
Out[6]: 
           0         1
1 Mon  99.000000  1.609539
  Tue  99.000000  1.464771
2 Mon  -0.819186 -1.122967
  Tue  -0.545171  0.475277

答案 1 :(得分:0)

我相信我们可以通过以下方式获得真正的灵活性:

index = [idx for idx, vals in enumerate(myDF.index.values) if vals[1] in ['Mon','Wed'] and vals[0] in [2,3,4]]
colums = [0,1]
myDF.iloc[index, columns] = 99

从for循环创建索引不是最有效的方法,因此可以创建一个字典,其中键是multiIndex元组,值是索引。

这样我们可以指定我们想要改变的两个索引级别中的哪些值。 .xs()执行类似的操作但不能通过该函数更改值。

如果有一种更简单的方法,我真的很想找到它..