簡體   English   中英

更改Pandas MultiIndex DataFrame中的特定列值

[英]Change Particular Column values in a Pandas MultiIndex DataFrame

考慮我們有以下數據幀

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.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

你所做的是被稱為鏈式分配 ,並且由於大熊貓所依賴的numpy內部運作的微妙之處而失敗。

由於您有MultiIndex,因此您的情況比一般警告所解決的情況更復雜。 要選擇外層中標簽為1且列標簽為0所有行,請使用.loc[1, 0] (另見這個答案 。)

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

我相信通過使用以下方法我們可以擁有真正的靈活性:

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()執行類似的操作,但您無法通過該函數更改值。

如果有一個更簡單的方法,我真的很想找到它..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM