2017-07-24 53 views
3

有這樣一個數據幀:如何得到適當的格式化指數在大熊貓數據幀

>>> df = pd.DataFrame({'name': ['foo', 'foo', 'bar', 'bar'], 
        'colx': [1, 2, 3, 4], 
        'coly': [5, 6, 7, 8]}) 
>>> df.set_index('name', inplace=True) 
>>> df 
     colx coly 
name    
foo  1  5 
foo  2  6 
bar  3  7 
bar  4  8 

怎麼可能得到像一個真正的格式化指數:

 colx coly 
name    
foo  1  5 
     2  6 
bar  3  7 
     4  8 

使大熊貓沒有按不會抱怨重複的指數。

回答

2

一個(在許多)選擇是增加一個新的指數水平:

In [49]: df = df.set_index(df.groupby(level=0).cumcount().add(1) \ 
          .to_frame('num')['num'], 
          append=True) 

In [50]: df 
Out[50]: 
      colx coly 
name num 
foo 1  1  5 
    2  2  6 
bar 1  3  7 
    2  4  8 

UPDATE:

不要大熊貓顯示在多指標重複的方式混淆

如果我們選擇name級多指標的所有值,我們仍然會看到重複:

In [51]: df.index.get_level_values(0) 
Out[51]: Index(['foo', 'foo', 'bar', 'bar'], dtype='object', name='name') 

這只是Pandas代表多重索引中的重複。我們可以關閉此顯示選項:

In [53]: pd.options.display.multi_sparse = False 

In [54]: df 
Out[54]: 
      colx coly 
name num 
foo 1  1  5 
foo 2  2  6 
bar 1  3  7 
bar 2  4  8 

In [55]: pd.options.display.multi_sparse = True 

In [56]: df 
Out[56]: 
      colx coly 
name num 
foo 1  1  5 
    2  2  6 
bar 1  3  7 
    2  4  8 

PS此選項不會更改索引值,它會影響只爲 -indices

+0

這個作品的表達中,但不應該大熊貓有少錯綜複雜的實現方式?此外它創建了一個多索引。 – PedroA

+0

@PedroA,你能解釋一下嗎 - 你想達到什麼目的?你打算如何使用索引?保留現有的索引值是否很重要?我們可以在索引值中添加一個數字,以便它們變成:'['foo1','foo2','bar1','bar2'等]' - 它會成爲您的選擇嗎?正如你所看到的,可能有很多不同的解決方案,但是我們需要知道你想要達到什麼...... – MaxU

+0

對不起,我還在學習熊貓,但我認爲生成的DF只是列名稱的索引'。你現在添加了一個新的索引'num'。我相信這一定是它,但是你可以擴大一點爲什麼你的答案是這樣的? – PedroA