#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
серии происходит следующее:
- если
A
это кадр/ряд данных иB
скаляр, вы получаете кадр/рядTrue
данных/False
, говорящий, равен ли каждый элементB
- если
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. Теперь я это вижу, большое спасибо!