2014-05-02 185 views
1

考慮,我們有以下數據框在大熊貓多指標數據框更改特定列值

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不變。我錯過了什麼。 謝謝

+0

你試過在數據框使用.update()? http://pandas.pydata.org/pandas-docs/version/0.13.1/generated/pandas.DataFrame.update.html#pandas.DataFrame.update – aonbyte

+0

不,更新確實有些不同。它需要另一個數據框作爲參數。 –

回答

3

當你嘗試這樣的事情時,熊貓的最新版本會發出警告。例如,在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 
+0

我希望特定索引的列中的所有值都可以更改。 '1 Mon 0'(0.214686)沒有變成99.任何解決方案? – RukTech

+0

我明白了。您需要'.loc'(基於標籤)而不是'.iloc'(基於位置)。我相應地編輯了答案。 –

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()做了類似的事情,但不能通過該函數更改值。

如果有一個更簡單的方法,我會找到它真正的興趣..

相關問題