2017-10-08 12 views
0

"for"サイクル内に "if"ステートメントを使用して、現在のアイテムのインデックスがサイクル(アイテムを含むパンダシリーズのインデックス)は、別のシリーズのインデックスの1つに対応しますが、そうすることでValueErrorが発生します。 これは、問題与え、コードの行です:ValueError:ステートメント内にある場合、バッファの次元数が正しくない(予想1、取得2)

if(ICM_items[ICM_items['track_id'] == i].index[0] in ICM_tgt_items.index.values.flatten().tolist()): 

私は、ランダムな整数やリストとの声明「の」の両側を変えてみましたが、それはまた、2つの項目が正しく構築され、動作しますが、中に結合されたとき彼らはエラーを提起するステートメント。

誰かが私に、どこに問題があるのか​​、同じタスクを実行する別の方法についてのヒントを教えてくれることを願っています。

ICM_itemsとICM_tgt_itemsは両方pandas.Series

ある以下のコンソールエラーがあります:

Traceback (most recent call last): 
File "/Users/LucaButera/git/rschallenge/similarity_to_recommandable_builder.py", line 27, in <module> 
dot[ICM_tgt_items[ICM_items[ICM_items['track_id'] == i].index[0]]] = 0 
File "/Users/LucaButera/anaconda/lib/python3.6/site-packages/pandas/core/series.py", line 603, in __getitem__ 
result = self.index.get_value(self, key) 
File "/Users/LucaButera/anaconda/lib/python3.6/site-packages/pandas/indexes/base.py", line 2169, in get_value 
tz=getattr(series.dtype, 'tz', None)) 
File "pandas/index.pyx", line 98, in pandas.index.IndexEngine.get_value (pandas/index.c:3557) 
File "pandas/index.pyx", line 106, in pandas.index.IndexEngine.get_value (pandas/index.c:3240) 
File "pandas/index.pyx", line 147, in pandas.index.IndexEngine.get_loc (pandas/index.c:4194) 
File "pandas/index.pyx", line 280, in pandas.index.IndexEngine._ensure_mapping_populated (pandas/index.c:6150) 
File "pandas/src/hashtable_class_helper.pxi", line 446, in pandas.hashtable.Int64HashTable.map_locations (pandas/hashtable.c:9261) 
ValueError: Buffer has wrong number of dimensions (expected 1, got 2) 
[Finished in 1.26s] 
+0

問題のセットアップはあまり明確ではありません。あなたが代表的なサンプルデータを提供した場合、それは役に立ちます。 [最小限の完全かつ検証可能なサンプルを作成する方法](https://stackoverflow.com/help/mcve)を参照してください。また、 'track_id == i'にマッチする' ICM_items'の最初のインデックスだけを見たいでしょうか?複数のインデックスが返される場合はどうなりますか? –

答えて

1

は、私は、あなたがあなたの式を簡素化をお勧めします.locを使用し、そして、そのような(エッジケースに目を光らせ続けるだろうtrack_idが指定されている場合は空になります。i)。
適切なテストデータを使用することで、これらの手順はバグ追跡を絞り込むのに役立ちます。

ICM_itemsデータ:

import numpy as np 
import pandas as pd 

N = 7 
max_track_id = 5 
idx1 = ['A','B','C'] 
icm_idx = np.random.choice(idx1, size=N) 
icm = {"track_id":np.random.randint(0, max_track_id, size=N)} 
ICM_items = pd.DataFrame(icm, index=icm_idx) 

ICM_items 
    track_id 
C   1 
A   1 
A   2 
C   1 
B   0 
B   0 
B   2 

ICM_tgt_itemsデータ:今

idx2 = ['A','B'] 
icm_tgt_idx = np.random.choice(idx2, size=N) 
icm = np.random.random(size=N) 
ICM_tgt_items = pd.DataFrame(icm, index=icm_tgt_idx) 

      0 
B 0.785614 
A 0.976523 
A 0.856821 
B 0.098086 
B 0.481140 
A 0.686156 
A 0.851714 

単純に比較してキャッチする可能性のあるエッジケース:

for i in range(max_track_id): 
    mask = ICM_items['track_id'] == i 
    try: 
     # use .loc for indexing, no need to flatten() or use .values on the right. 
     if ICM_items.loc[mask].index[0] in ICM_tgt_items.index: 
      print("found") 
     else: 
      print("not found") 
    # catch error if i not found in track_id 
    except IndexError as e:   
     print(f"ERROR at i={i}: {e}") 

出力:

found 
not found 
found 
ERROR at i=3: index 0 is out of bounds for axis 0 with size 0 
ERROR at i=4: index 0 is out of bounds for axis 0 with size 0 
関連する問題