【问题标题】:Python ValueError: Can only compare identically-labeled Series objectsPython ValueError:只能比较标记相同的系列对象
【发布时间】:2018-01-04 10:27:12
【问题描述】:

我看到了有关此问题的 stack over flow 帖子,但没有任何内容符合我的要求,因此我正在创建此帖子。我正在使用python 3.6。我有一个数据框 df_student。示例数据如下图所示

我正在尝试使用以下代码过滤数据框

df_filter1=df_student.loc[(df_student['year'] == x & (df_student['Grade']==y) & (df_student['Mail']==z)]

x,y & z 是从代码生成的,抱歉我不能分享代码。但运行后我收到错误消息

ValueError: Can only compare identically-labeled Series objects

检查后,我发现 x、y、z 是作为单个值“系列”对象生成的。x、y 和 z 在我的数据框年份中也是 str 类型,为 int64 类型,等级和邮件是“O”类型.所以我修改了代码并使用了以下代码

df_filter1=df_student.loc[(df_student['year'] == int(x.values[0]) & (df_student['Grade']==y.values[0]) & (df_student['Mail']==z.values[0])]

现在,我没有收到任何错误消息,但 df_filter1 显示为一个空数据框,其中应该有一些行。请建议我需要做什么修改

我已经按照以下修改 耶兹瑞尔的建议

df_filter1=df_student.loc[(df_student['year'] == x.astype(int).iat[0]) & 
                          (df_student['Grade']==y.iat[0]) & 
                          (df_student['Mail']==z.iat[0])]

但收到错误消息

AttributeError: 'int' object has no attribute 'astype'

我已按照 jezrael 的建议修改了代码,并再次从我的 csv 文件中重新加载了数据,并在下次运行时遇到了这些错误

  File "<ipython-input-69-6c2be16ee93f>", line 6, in studQuery
    df_filter1=df_student.loc[(df_student['year'] == x) & (df_student['Grade']==y.iat[0]) & (df_student['Mail']==z.iat[0])]

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py", line 1964, in __getitem__
    return self._getitem_column(key)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py", line 1971, in _getitem_column
    return self._get_item_cache(key)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py", line 1645, in _get_item_cache
    values = self._data.get(item)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals.py", line 3590, in get
    loc = self.items.get_loc(item)

  File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\base.py", line 2444, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))

  File "pandas\_libs\index.pyx", line 132, in pandas._libs.index.IndexEngine.get_loc

  File "pandas\_libs\index.pyx", line 154, in pandas._libs.index.IndexEngine.get_loc

  File "pandas\_libs\hashtable_class_helper.pxi", line 1210, in pandas._libs.hashtable.PyObjectHashTable.get_item

  File "pandas\_libs\hashtable_class_helper.pxi", line 1218, in pandas._libs.hashtable.PyObjectHashTable.get_item

KeyError: 'year'

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用 if-else 语句来检查值的类型是否为int

    x = int(x) if isinstance(x, int) else int(x.iat[0])
    df_filter1=df_student.loc[(df_student['year'] == x) & 
                              (df_student['Grade']==y.iat[0]) & 
                              (df_student['Mail']==z.iat[0])]
    

    【讨论】:

    • 嘿,你应该避免回答错别字。 cmets 中可以提到替代解决方案。相反,投票关闭。
    • @cᴏʟᴅsᴘᴇᴇᴅ - 你是正确的,但我测试了它,问题出在别的东西上,因为如果删除 ) 然后得到 SyntaxError: invalid syntax
    • 嗨@jezrael。它适用于一组 x、y 和 z & 另一组,我收到错误消息,因为 AttributeError:'int' 对象没有属性 'iat'。请建议
    • 哎呀,打错了然后需要x.astype(int).iat[0]int(x.iat[0])
    • Ho @jezrael,我已经按照您的第一个选项进行了修改。但是收到错误消息为 AttributeError: 'int' object has no attribute 'astype'。我已经在我的第一个线程中更新了修改后的代码.你能看看和建议吗?我的猜测是在某些情况下 x 不存储为系列对象,而是存储为简单的整数变量。这是一个很大的 for 循环代码,因此很难验证我的猜测。
    猜你喜欢
    • 2020-09-17
    • 2018-12-06
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 1970-01-01
    相关资源
    最近更新 更多