【问题标题】:ValueError: ('Lengths must match to compare', (229025,), (1,))ValueError: ('长度必须匹配才能比较', (229025,), (1,))
【发布时间】:2021-10-27 02:46:40
【问题描述】:

我在 Jupyter notebook 中工作,我的理解是在最后一行调用 df_speed_full['cam_id'] == rand_cam_id 我将索引标记为TrueFalse,然后将它们传递给外部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:\Users\HENRYK~1\AppData\Local\Temp/ipykernel_18136/4206593172.py in <module>
----> 1 rand_cam_df = df_speed_full[df_speed_full['cam_id'] == rand_cam_id]

~\anaconda3\lib\site-packages\pandas\core\ops\common.py in new_method(self, other)
     67         other = item_from_zerodim(other)
     68 
---> 69         return method(self, other)
     70 
     71     return new_method

~\anaconda3\lib\site-packages\pandas\core\arraylike.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__")

~\anaconda3\lib\site-packages\pandas\core\series.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)

~\anaconda3\lib\site-packages\pandas\core\ops\array_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,))

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    投诉是针对您的== 操作(通过特殊方法__eq__ 在错误回溯中这一事实可见)。

    当比较像 A == B 这样的 DataFrame 或 Series 对象时,会发生以下情况:

    1. 如果A 是一个数据帧/系列并且B 是一个标量,你会得到一个True/False 的数据帧/系列,表示每个元素是否等于B
    2. 如果A 是一个数据帧/系列并且B 是一个数据帧/系列/列表/numpy-array/something-like-that,那么A 的每个元素都将与@987654332 的每个对应元素进行比较@。这仅适用于 AB 具有相同的形状

    您将进入第二个选项。但是,您将一个包含 229025 个元素的序列与一个预期包含 229025 个元素但只有 1 个元素的列表进行比较。发生这种情况是因为您正在与一个具有单个元素的 list 进行匹配。

    您可能想用rand_cam_id = list(rand_row['cam_id'])[0] 替换第二行。这将使rand_cam_id 不是列表,而是您希望在列表中找到的单个元素。这样,== 操作将通过第一个选项并为您提供预期的元素匹配。

    【讨论】:

    • 我现在看到了,非常感谢!
    猜你喜欢
    • 2019-08-24
    • 2017-03-25
    • 2016-04-07
    • 2017-04-12
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多