2016-11-07 128 views
3

我想要查找多級數據框中特定列的更改名稱的方式。熊貓:更改具有多級列的數據框中的特定列名稱

有了這些數據:

data = { 
    ('A', '1', 'I'): [1, 2, 3, 4, 5], 
    ('B', '2', 'II'): [1, 2, 3, 4, 5], 
    ('C', '3', 'I'): [1, 2, 3, 4, 5], 
    ('D', '4', 'II'): [1, 2, 3, 4, 5], 
    ('E', '5', 'III'): [1, 2, 3, 4, 5], 
} 

dataDF = pd.DataFrame(data) 

這個代碼不工作:

dataDF.rename(columns = {('A', '1', 'I'):('Z', '100', 'Z')}, inplace=True) 

結果:

A B C D E 
    1 2 3 4 5 
    I II I II III 
0 1 1 1 1 1 
1 2 2 2 2 2 
2 3 3 3 3 3 
3 4 4 4 4 4 
4 5 5 5 5 5 

而且也沒有:

dataDF.columns.values[0] = ('Z', '100', 'Z') 

結果:

A B C D E 
    1 2 3 4 5 
    I II I II III 
0 1 1 1 1 1 
1 2 2 2 2 2 
2 3 3 3 3 3 
3 4 4 4 4 4 
4 5 5 5 5 5 

但隨着工作上面的代碼組合!

dataDF.columns.values[0] = ('Z', '100', 'Z') 
dataDF.rename(columns = {('A', '1', 'I'):('Z', '100', 'Z')}, inplace=True) 
dataDF 

結果:

Z B C D E 
    100 2 3 4 5 
    Z II I II III 
0 1 1 1 1 1 
1 2 2 2 2 2 
2 3 3 3 3 3 
3 4 4 4 4 4 
4 5 5 5 5 5 

是大熊貓的這種錯誤?

回答

4

這是我的理論

大熊貓不希望pd.Index s到是可變的。我們可以看到這一點,如果我們試圖更改索引的第一個元素自己

dataDF.columns[0] = ('Z', '100', 'Z') 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-32-2c0b76762235> in <module>() 
----> 1 dataDF.columns[0] = ('Z', '100', 'Z') 

//anaconda/envs/3.5/lib/python3.5/site-packages/pandas/indexes/base.py in __setitem__(self, key, value) 
    1372 
    1373  def __setitem__(self, key, value): 
-> 1374   raise TypeError("Index does not support mutable operations") 
    1375 
    1376  def __getitem__(self, key): 

TypeError: Index does not support mutable operations 

但大熊貓無法控制你做什麼的values屬性。

dataDF.columns.values[0] = ('Z', '100', 'Z') 

我們看到dataDF.columns看起來一樣,但dataDF.columns.values清楚地反映了變化。不幸的是,df.columns.values不是顯示在數據框中的東西。


另一方面,這確實看起來應該起作用。事實上,它不會感覺我錯了。

dataDF.rename(columns={('A', '1', 'I'): ('Z', '100', 'Z')}, inplace=True) 

我相信這只是已經改變的值之後的作品,原因是rename通過觀察值迫使列的重建。由於我們改變了價值觀,現在它起作用了。這是非常糟糕的,我不建議建立一個依賴於此的流程。


我的建議

  • 識別列名的位置,你想改變
  • 列的指定名稱值的陣列
  • 從頭開始建立新的欄目,明確地

from_col = ('A', '1', 'I') 
to_col = ('Z', '100', 'Z') 
colloc = dataDF.columns.get_loc(from_col) 
cvals = dataDF.columns.values 
cvals[colloc] = to_col 

dataDF.columns = pd.MultiIndex.from_tuples(cvals.tolist()) 

dataDF 

[![enter code here][1]][1] 
+0

感謝您的解釋! –

+0

不用客氣 – piRSquared

0

您可以簡單地改變它像DF.columns.levels=[[u'Z', u'B', u'C', u'D', u'E'],[u'5', u'2', u'3', u'4', u'5'],[u'IIIIII', u'II', u'III']]

+0

我還不確定它的bug是否如你所說。 –

+0

感謝您的解釋! –

相關問題