2015-11-11 7 views
7

後NaNを含んでいる私の問題の最小作業例です:パンダデータフレームは、ここでは、書き込み動作

import pandas as pd 

columns = pd.MultiIndex.from_product([['a', 'b', 'c'], range(2)]) 
a = pd.DataFrame(0.0, index=range(3),columns=columns, dtype='float') 
b = pd.Series([13.0, 15.0]) 

a.loc[1,'b'] = b # this line results in NaNs 
a.loc[1,'b'] = b.values # this yields correct behavior 

なぜ最初の割り当てが間違っていますか?どちらのシリーズも同じインデックスを持つように見えるので、正しい結果が得られるはずです。

私はパンダ0.17.0を使用しています。

答えて

4

あなたは

a.loc[1,'b'] = b 

bを書くbのインデックスが正確にaにコピーするb内の値の順序でa.loc[1,'b']によって生成されたインデクサーと一致する必要があり、シリーズです。それはa.columnsMultiIndexあるとき、the indexer for a.loc[1,'b']があること、しかし、結局のところ:

(Pdb) p new_ix 
Index([(u'b', 0), (u'b', 1)], dtype='object') 

bのインデックスが一致していない

(Pdb) p ser.index 
Int64Index([0, 1], dtype='int64') 

であるのに対し、したがって

(Pdb) p ser.index.equals(new_ix) 
False 

値が揃っていないため、the code branch you fall into

を割り当てます
(Pdb) p ser.reindex(new_ix).values 
array([ nan, nan]) 

は、私はあなたのコードにpdb.set_trace()を追加することでこれを見つけた:

import pandas as pd 

columns = pd.MultiIndex.from_product([['a', 'b', 'c'], range(2)]) 
a = pd.DataFrame(0.0, index=range(3),columns=columns, dtype='float') 
b = pd.Series([13.0, 15.0]) 
import pdb 
pdb.set_trace() 
a.loc[1,'b'] = b # this line results in NaNs 
a.loc[1,'b'] = b.values # this yields correct behavior 

と単に(「ハイレベル」でそれをステップとthe problem occurs in

 if isinstance(value, ABCSeries): 
      value = self._align_series(indexer, value) 

を発見し、再びそれを介してステッピングより細かい歯のついた櫛で)、ブレイクポイントはself._align_series(indexer, value)という行から始まります。


あなたもマルチインデックスであることをbのインデックスを変更した場合ことに注意してください:その後、

b = pd.Series([13.0, 15.0], index=pd.MultiIndex.from_product([['b'], [0,1]])) 

import pandas as pd 

columns = pd.MultiIndex.from_product([['a', 'b', 'c'], range(2)]) 
a = pd.DataFrame(0.0, index=range(3),columns=columns, dtype='float') 
b = pd.Series([13.0, 15.0], index=pd.MultiIndex.from_product([['b'], [0,1]])) 
a.loc[1,'b'] = b 
print(a) 

利回り

a  b  c 
    0 1 0 1 0 1 
0 0 0 0 0 0 0 
1 0 0 13 15 0 0 
2 0 0 0 0 0 0 
+0

私の場合、 'b'は実際には別のDataFrame(MultiIndexなし)をスライスして得た一時的なシリーズです。その一時的なシリーズを保存せずにこの問題を解決し、再インデックスする方法はありますか? – MindV0rtex

+0

私は最も簡単な回避策はあなたが示したものだと思います - インデックスのないオブジェクトを割り当てます: 'a.loc [1、 'b'] = b.values'。 – unutbu

1

をあなたが直接を割り当てることができますをaのコラムに入力してください。bはマルチインデックスシリーズではありません。bを変更すると、それを動作させるでしょう:パンダは額面でbの値をとり、かつしようとするため

columns = pd.MultiIndex.from_product([['a', 'b', 'c'], range(2)]) 
a = pd.DataFrame(0.0, index=range(3),columns=columns, dtype='float') 
index = pd.MultiIndex.from_product([['b'], range(2)]) 
b = pd.Series([13.0, 15.0], index=index) 

a.loc[1,'b'] = b 
print(a) 

は、あなたがb.valuesを使用

a  b  c 
    0 1 0 1 0 1 
0 0 0 0 0 0 0 
1 0 0 13 15 0 0 
2 0 0 0 0 0 0 

他の場合、得、おそらく動作します指定された値に対して最も論理的な割り当てを行います。

関連する問題