2017-07-06 56 views
2

効率的にMultiIndexed DataFrameに単一行を追加するのに問題があります。行を追加することによって、MultiIndexは単純なタプルのインデックスに平坦化されます。不思議なことに、MultiIndexedカラムではこれは問題ではありません。MultiIndexを平坦化せずにpandas DataFrameに行を追加する方法

システム情報:

Python 3.6.1 |Continuum Analytics, Inc.| (default, Mar 22 2017, 19:25:17) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import pandas as pd 
>>> pd.__version__ 
'0.19.2' 

例のデータ:マルチインデックスの行と列の両方でDATAFRAME

import numpy as np 
import pandas as pd 

index = pd.MultiIndex(levels=[['bar', 'foo'], ['one', 'two']], 
         labels=[[0, 0, 1, 1], [0, 1, 0, 1]], 
         names=['row_0', 'row_1']) 
columns = pd.MultiIndex(levels=[['dull', 'shiny'], ['a', 'b']], 
         labels=[[0, 0, 1, 1], [0, 1, 0, 1]], 
         names=['col_0', 'col_1']) 
df = pd.DataFrame(np.ones((4,4)),columns=columns, index=index) 

print(df) 

    col_0  dull  shiny  
col_1   a b  a b 
row_0 row_1      
bar one 1.0 1.0 1.0 1.0 
     two 1.0 1.0 1.0 1.0 
foo one 1.0 1.0 1.0 1.0 
     two 1.0 1.0 1.0 1.0 

それはデータフレームに追加の列を追加するには問題ありません:

df['last_col'] = 42 #define a new column and assign a value 

print(df) 

col_0  dull  shiny  last_col 
col_1   a b  a b   
row_0 row_1        
bar one 1.0 1.0 1.0 1.0  42 
     two 1.0 1.0 1.0 1.0  42 
foo one 1.0 1.0 1.0 1.0  42 
     two 1.0 1.0 1.0 1.0  42 

しかし、(locを使って)行を追加するために同じことをすると、MultiIndexは0123に平坦化されますタプルのシンプルなインデックス:

df.loc['last_row'] = 43 #define a new row and assign a value 

print(df) 

col_0  dull  shiny  last_col 
col_1   a  b  a  b   
(bar, one) 1.0 1.0 1.0 1.0  42 
(bar, two) 1.0 1.0 1.0 1.0  42 
(foo, one) 1.0 1.0 1.0 1.0  42 
(foo, two) 1.0 1.0 1.0 1.0  42 
last_row 43.0 43.0 43.0 43.0  43 

誰もが両方のシンプルかつ効率的な方法でインデックスを平坦化せずに行を追加する方法のアイデアを持っていますか?どうもありがとうございました!!それは似ています列の場合

df.loc[('last_row', 'a'), :] = 43 
print(df) 
col_0   dull  shiny  
col_1    a  b  a  b 
row_0 row_1       
bar  one  1.0 1.0 1.0 1.0 
     two  1.0 1.0 1.0 1.0 
foo  one  1.0 1.0 1.0 1.0 
     two  1.0 1.0 1.0 1.0 
last_row a  43.0 43.0 43.0 43.0 

+0

問題を開設:https://github.com/pandas-dev/pandas/issues/17024 –

答えて

2

は私がMultiIndexの両方の値を定義しますが、タプルを必要だと思う

df[('last_col', 'a')] = 43 
print(df) 
col_0  dull  shiny  last_col 
col_1   a b  a b  a 
row_0 row_1        
bar one 1.0 1.0 1.0 1.0  43 
     two 1.0 1.0 1.0 1.0  43 
foo one 1.0 1.0 1.0 1.0  43 
     two 1.0 1.0 1.0 1.0  43 

EDIT:あなたが列名を定義必要と思われる

、すべて使用する必要がある場合:

df.loc['last_row',:] = 43 
print(df) 
col_0   dull  shiny  
col_1    a  b  a  b 
row_0 row_1       
bar  one  1.0 1.0 1.0 1.0 
     two  1.0 1.0 1.0 1.0 
foo  one  1.0 1.0 1.0 1.0 
     two  1.0 1.0 1.0 1.0 
last_row  43.0 43.0 43.0 43.0 

レベルが定義されていない場合は、空の文字列を追加します

print(df.index) 
MultiIndex(levels=[['bar', 'foo', 'last_row'], ['one', 'two', '']], 
      labels=[[0, 0, 1, 1, 2], [0, 1, 0, 1, 2]], 
      names=['row_0', 'row_1']) 
df.loc['last_row','dull'] = 43 
print(df) 
col_0   dull  shiny  
col_1    a  b  a b 
row_0 row_1      
bar  one  1.0 1.0 1.0 1.0 
     two  1.0 1.0 1.0 1.0 
foo  one  1.0 1.0 1.0 1.0 
     two  1.0 1.0 1.0 1.0 
last_row  43.0 43.0 NaN NaN 
df.loc['last_row', ('dull', 'a')] = 43 
print(df) 
col_0   dull  shiny  
col_1    a b  a b 
row_0 row_1      
bar  one  1.0 1.0 1.0 1.0 
     two  1.0 1.0 1.0 1.0 
foo  one  1.0 1.0 1.0 1.0 
     two  1.0 1.0 1.0 1.0 
last_row  43.0 NaN NaN NaN 
+0

こんにちはjeszrael、それは素晴らしいように見える。どうもありがとうございます!! –

関連する問題