ValueError: Буфер имеет неправильное количество измерений (ожидается 1, получено 2) в операторе if

Я пытаюсь использовать оператор «if» внутри цикла «for», чтобы проверить, соответствует ли индекс текущего элемента в цикле (индекс серии pandas, содержащей элемент), одному из индексов другой серии, но при этом возникает ValueError. Это строка кода, которая вызывает проблемы:

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

Я попытался изменить обе стороны оператора «in» случайными целыми числами или списками, и это работает, также два элемента построены правильно, но при объединении в операторе они вызывают ошибку.

Надеюсь, кто-нибудь может дать мне несколько советов о том, в чем проблема или альтернативный способ выполнить ту же задачу.

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]

person Luca Butera    schedule 08.10.2017    source источник
comment
Настройка для вашей проблемы не очень ясна. Было бы полезно, если бы вы предоставили репрезентативные выборочные данные. См. Как создать минимальный, полный и проверяемый пример. Кроме того, вы уверены, что хотите просмотреть только первый индекс ICM_items, соответствующий track_id == i? Что делать, если возвращается несколько индексов?   -  person andrew_reece    schedule 09.10.2017


Ответы (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
person andrew_reece    schedule 08.10.2017