【问题标题】:Python Pandas: Resolving "List Object has no Attribute 'Loc'"Python Pandas:解决“列表对象没有属性‘Loc’”
【发布时间】:2021-12-03 10:10:11
【问题描述】:

我使用以下方法将 CSV 作为 DataFrame 导入:

import numpy as np
import pandas as pd

df = pd.read_csv("test.csv")

然后我尝试根据 ID 进行简单替换:
df.loc[df.ID == 103, ['fname', 'lname']] = 'Michael', 'Johnson'

我收到以下错误:

AttributeError: 'list' object has no attribute 'loc'

注意,当我执行 print pd.version() 时,我得到 0.12.0,所以使用 11 之前的版本不是问题(至少据我所知)。有什么想法吗?

【问题讨论】:

  • 该语法对我来说很好 - 如果您提供一个可重现的示例,那么它会更容易提供帮助,因为它可能取决于 csv 文件中的数据问题。
  • 是的也适用于我,您的 csv 样本可能会有所帮助。

标签: python pandas


【解决方案1】:

从评论中提取:“我正在这样做:”

df = [df.hc== 2]

您在那里创建的是一个“掩码”:一个带有布尔值的数组,表示索引的哪一部分满足您的条件。

要根据您想要执行的条件过滤数据框:

df = df[df.hc == 2]

更明确一点的是:

mask = df.hc == 2
df = df[mask]

如果您想保留整个数据框并且只想替换特定值,则有替换方法:Python pandas equivalent for replace。另一种(性能方面很棒)方法是创建一个单独的 DataFrame,其中 from/to 值作为列,并使用 pd.merge 将其组合到现有的 DataFrame 中。并且使用您的索引来设置值也是可能的:

df[mask]['fname'] = 'Johnson'

但是对于更大的替换集合,您可能希望使用其他两种方法之一,或者将“应用”与 lambda 函数一起使用(用于值转换)。最后但同样重要的是:您可以使用 .fillna('bla') 快速填充 NA 值。

【讨论】:

    【解决方案2】:

    回溯向您表明 df 是 list 而不是 DataFrame 正如您的代码行中所预期的那样。

    这意味着在df = pd.read_csv("test.csv")df.loc[df.ID == 103, ['fname', 'lname']] = 'Michael', 'Johnson' 之间还有其他代码行将列表对象分配给df。查看那段代码以找到您的错误

    【讨论】:

      【解决方案3】:

      @Boud 的回答是正确的。如果右侧列表与替换元素的数量匹配,则 Loc 分配工作正常

      In [56]: df = DataFrame(dict(A =[1,2,3], B = [4,5,6], C = [7,8,9]))
      
      In [57]: df
      Out[57]: 
         A  B  C
      0  1  4  7
      1  2  5  8
      2  3  6  9
      
      In [58]: df.loc[1,['A','B']] = -1,-2
      
      In [59]: df
      Out[59]: 
         A  B  C
      0  1  4  7
      1 -1 -2  8
      2  3  6  9
      

      【讨论】:

        猜你喜欢
        • 2013-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-06
        • 2020-12-18
        • 1970-01-01
        相关资源
        最近更新 更多