効率的に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
:
問題を開設:https://github.com/pandas-dev/pandas/issues/17024 –