あなたは
a.loc[1,'b'] = b
とb
を書くb
のインデックスが正確にa
にコピーするb
内の値の順序でa.loc[1,'b']
によって生成されたインデクサーと一致する必要があり、シリーズです。それはa.columns
がMultiIndex
あるとき、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
私の場合、 'b'は実際には別のDataFrame(MultiIndexなし)をスライスして得た一時的なシリーズです。その一時的なシリーズを保存せずにこの問題を解決し、再インデックスする方法はありますか? – MindV0rtex
私は最も簡単な回避策はあなたが示したものだと思います - インデックスのないオブジェクトを割り当てます: 'a.loc [1、 'b'] = b.values'。 – unutbu