Ошибка значения: (‘Длины должны совпадать для сравнения’, (229025,), (1,))

#python #pandas

Вопрос:

Я работаю в записной книжке Jupyter, и , насколько я понимаю, в последней строке, вызывая df_speed_full['cam_id'] == rand_cam_id , я помечаю индексы как True и False , а затем передаю их во внешний df_speed_full , чтобы выбрать только те, с True которыми . И все же каким-то образом я это понимаю. Я был бы признателен за объяснение того, что я здесь упускаю. Я попытался прочитать другие ответы, но ничего не щелкнуло

 rand_row = df_speed_full.sample(random_state=42)
rand_cam_id = list(rand_row['cam_id'])
rand_cam_df = df_speed_full[df_speed_full['cam_id'] == rand_cam_id]
 

И вот что я получаю:

 ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
C:UsersHENRYK~1AppDataLocalTemp/ipykernel_18136/4206593172.py in <module>
----> 1 rand_cam_df = df_speed_full[df_speed_full['cam_id'] == rand_cam_id]

~anaconda3libsite-packagespandascoreopscommon.py in new_method(self, other)
     67         other = item_from_zerodim(other)
     68 
---> 69         return method(self, other)
     70 
     71     return new_method

~anaconda3libsite-packagespandascorearraylike.py in __eq__(self, other)
     30     @unpack_zerodim_and_defer("__eq__")
     31     def __eq__(self, other):
---> 32         return self._cmp_method(other, operator.eq)
     33 
     34     @unpack_zerodim_and_defer("__ne__")

~anaconda3libsite-packagespandascoreseries.py in _cmp_method(self, other, op)
   5500 
   5501         with np.errstate(all="ignore"):
-> 5502             res_values = ops.comparison_op(lvalues, rvalues, op)
   5503 
   5504         return self._construct_result(res_values, name=res_name)

~anaconda3libsite-packagespandascoreopsarray_ops.py in comparison_op(left, right, op)
    259         #  The ambiguous case is object-dtype.  See GH#27803
    260         if len(lvalues) != len(rvalues):
--> 261             raise ValueError(
    262                 "Lengths must match to compare", lvalues.shape, rvalues.shape
    263             )

ValueError: ('Lengths must match to compare', (229025,), (1,))

 

Ответ №1:

Жалоба касается вашей == операции (видно по тому, что специальный метод __eq__ находится в обратном отслеживании ошибок).

При сравнении фреймов данных или объектов A == B серии происходит следующее:

  1. если A это кадр/ряд данных и B скаляр, вы получаете кадр/ряд True данных/ False , говорящий, равен ли каждый элемент B
  2. если A является фреймом/серией данных и B является фреймом/серией/списком/массивом numpy/чем-то подобным, то каждый элемент A сравнивается с каждым соответствующим элементом B . Это работает только в том случае, если A они B имеют одинаковую форму.

Вы переходите ко 2 — му варианту. Но вы сравниваете серию с 229025 элементами со списком, который, как ожидалось, будет содержать 229025 элементов, но содержит только 1. Это происходит потому, что вы сопоставляете a list с одним элементом.

Вы, вероятно, хотите заменить 2-ю строку на rand_cam_id = list(rand_row['cam_id'])[0] . Это создаст rand_cam_id не список, а единственный элемент, который вы ожидаете найти в списке. Таким образом, == операция пройдет через 1-й вариант и даст вам совпадения по элементам, которые вы ожидали.

Комментарии:

1. Теперь я это вижу, большое спасибо!