2017-01-18 2 views
1

Pandas 0.18.1から0.19.2にアップグレードした後、新しいレベルとラベルをデータフレームに追加しようとすると、次のエラーが発生します。何が問題なのか?pandasのset_labels中に新しいエラー0.19.2:ValueError:不等なラベルの長さ

print index 

MultiIndex(levels=[[u'1', u'2'], [u'nextLevel']], 
      labels=[[0, 1], [0, 0]], 
      names=[u'segment..ASRinfo..supportedUtt', u'label']) 

print levels 

[['1', '2', 'Total'], ['nextLevel']] 

print labels 

[[0, 1, 2], [0, 0, 0]] 

index = index.set_levels(levels) 
print index 

MultiIndex(levels=[[u'Supported', u'Unsupported', u'Total'], [u'nextLevel']], 
      labels=[[0, 1], [0, 0]], 
      names=[u'segment..ASRinfo..supportedUtt', u'label']) 

    index = index.set_labels(labels) 


--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-11-f6fb11fbbb3a> in <module>() 
    288 
    289 # Initialize dfplot 
--> 290 slice_data() 
    291 
    292 if len(resultList)==1: 

<ipython-input-11-f6fb11fbbb3a> in slice_data(*args) 
    71  index = index.set_levels(levels) 
    72  print index 
---> 73  index = index.set_labels(labels) 
    74  data_slice = data_slice.reindex(index) 
    75 

/Users/user1/anaconda/lib/python2.7/site-packages/pandas/indexes/multi.pyc in set_labels(self, labels, level, inplace, verify_integrity) 
    350    idx = self._shallow_copy() 
    351   idx._reset_identity() 
--> 352   idx._set_labels(labels, level=level, verify_integrity=verify_integrity) 
    353   if not inplace: 
    354    return idx 

/Users/user1/anaconda/lib/python2.7/site-packages/pandas/indexes/multi.pyc in _set_labels(self, labels, level, copy, validate, verify_integrity) 
    285 
    286   if verify_integrity: 
--> 287    self._verify_integrity(labels=new_labels) 
    288 
    289   self._labels = new_labels 

/Users/user1/anaconda/lib/python2.7/site-packages/pandas/indexes/multi.pyc in _verify_integrity(self, labels, levels) 
    145    if len(label) != label_length: 
    146     raise ValueError("Unequal label lengths: %s" % 
--> 147         ([len(lab) for lab in labels])) 
    148    if len(label) and label.max() >= len(level): 
    149     raise ValueError("On level %d, label max (%d) >= length of" 

ValueError: Unequal label lengths: [3, 3] 

新しいパンダコードのバグかどうか疑問に思います。おそらく、self.labels [0]はラベル[0]ですか?

def _verify_integrity(self, labels=None, levels=None): 
    """ 

    Parameters 
    ---------- 
    labels : optional list 
     Labels to check for validity. Defaults to current labels. 
    levels : optional list 
     Levels to check for validity. Defaults to current levels. 

    Raises 
    ------ 
    ValueError 
     * if length of levels and labels don't match or any label would 
     exceed level bounds 
    """ 
    # NOTE: Currently does not check, among other things, that cached 
    # nlevels matches nor that sortorder matches actually sortorder. 
    labels = labels or self.labels 
    levels = levels or self.levels 

    if len(levels) != len(labels): 
     raise ValueError("Length of levels and labels must match. NOTE:" 
         " this index is in an inconsistent state.") 
    label_length = len(self.labels[0]) 
    for i, (level, label) in enumerate(zip(levels, labels)): 
     if len(label) != label_length: 
      raise ValueError("Unequal label lengths: %s" % 
          ([len(lab) for lab in labels])) 
     if len(label) and label.max() >= len(level): 
      raise ValueError("On level %d, label max (%d) >= length of" 
          " level (%d). NOTE: this index is in an" 
          " inconsistent state" % (i, label.max(), 
                 len(level))) 
+0

これは 'labels = labelsまたはself.labels;の過去のすべてのようです。 levels = levelsまたはself.levels'は 'labels'または' levels'だけを使用します –

+0

はい、私は同意します。 0.18.1のような以前のバージョンのパンダコードを振り返ってみると、ラベルとレベルは次のように設定されます: 'labels、levels = self.labels、self.levels' しかしラベルとレベルの定義をこの新しいコードは、参照をどこにでも更新しませんでした。 – user1340654

答えて

0

私は自分の修正をテストしました。私はパンダにバグを提出: https://github.com/pandas-dev/pandas/issues/15157

+0

バグレポートを提出する方法の詳細な手順に従ってください。 –

+0

これは、このインデックスがDataFrameの一部であるかのように動作しないと思うので、そのDataFrameを使用しようとするとエラーが発生します。欠損値を持つ新しい行に関連付けられた実際のデータを自動的には入力しません。これが 'reindex'の目的です。 –

0

をそのバグ場合、私はわからない - 私はパンダがそれをあなたの方法をやって欠損値を持つすべての余分なインデックスを置き換えることができたと私はあなたがreindex

df.reindex(index2) 

index = pd.MultiIndex(levels=[[u'1', u'2'], [u'nextLevel']], 
      labels=[[0, 1], [0, 0]], 
      names=[u'segment..ASRinfo..supportedUtt', u'label']) 

index2 = pd.MultiIndex(levels=[['1', '2', 'Total'], ['nextLevel']], 
      labels=[[0, 1, 2], [0, 0, 0]], 
      names=[u'segment..ASRinfo..supportedUtt', u'label']) 
を使用すべきだと思います
+0

ありがとう、私はそれを試してみましょう。インデックスからindex2を構築する最良の方法は何ですか? – user1340654

0

私はPandasの新人です。私は自分の問題を解決するのに適応しにくいMultiIndexingに関するドキュメントを発見しました。基本的には、余分な行を追加したいと思います。これは私が思いついた解決策です。おそらくもっと良い方法があります。あなたが望むならば、分かち合いましょう。

groupbyColumns = ['label0', 'label1'] 
data_slice = dataframe.groupby(by=groupbyColumns).sum() 

index = data_slice.index 

levels = list() 
for levelIter in range(len(data_slice.index.levels)): 
    levels.append([x for x in data_slice.index.levels[levelIter]]) 
levels[0].append('Total') 
if len(resultList)==2: 
    levels[-1].append('Difference') 
    addIndexCountForDifferenceRow = 1 
else: 
    addIndexCountForDifferenceRow = 0 

# Create new indexing sequence since we are adding Total (and Difference if doing comparison) rows 
labels = list() 
for labelIter in range(len(data_slice.index.labels)): 
    labels.append(list()) 
if len(data_slice.index.labels)==2: 
    labels0 = [x for x in data_slice.index.labels[0]] 
    labels1 = [x for x in data_slice.index.labels[1]] 
    for iter0 in range(max(labels0)+2): 
     for iter1 in range(max(labels1)+1+addIndexCountForDifferenceRow): 
      labels[0].append(iter0) 
      labels[1].append(iter1) 
if len(data_slice.index.labels)==3: 
    labels0 = [x for x in data_slice.index.labels[0]] 
    labels1 = [x for x in data_slice.index.labels[1]] 
    labels2 = [x for x in data_slice.index.labels[2]] 
    for iter0 in range(max(labels0)+2): 
     for iter1 in range(max(labels1)+1): 
      for iter2 in range(max(labels2)+1+addIndexCountForDifferenceRow): 
       labels[0].append(iter0) 
       labels[1].append(iter1) 
       labels[2].append(iter2) 

index = index.set_levels(levels) 
index = index.set_labels(labels) 
data_slice = data_slice.reindex(index)