Python Pandas: 解决"List Object has no Attribute 'Loc'"

5

我使用以下代码将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'对象没有属性'loc'

注意,当我执行print pd.version()时,我得到的版本是0.12.0,所以这不是一个问题(至少在我理解的范围内)与使用11版之前的版本有关。有什么想法吗?


那个语法对我来说很好用 - 如果您提供一个可重现的例子,那么帮助会更容易,因为它可能取决于csv文件中的数据问题。 - Peter Fine
是的,对我也有帮助,您提供CSV文件的样例可能更好。 - C Mars
3个回答

5
从评论中继续:“我正在做这件事:”
df = [df.hc== 2]

你创建的东西是一个“掩码”:一个包含布尔值的数组,指明哪些索引满足你的条件。
要根据条件筛选数据框,你需要这样做:
df = df[df.hc == 2]

稍微更明确一些:
mask = df.hc == 2
df = df[mask]

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

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

但是,如果你需要替换更多的内容,你可以使用另外两种方法之一或使用"apply"和lambda函数(进行值转换)。最后但并非最不重要的:你可以使用.fillna('bla')来快速填充NA值。


1
@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

1
追踪回溯信息表明df是一个列表,而不是你代码行中期望的DataFrame。这意味着在“df = pd.read_csv(“test.csv”)”和“df.loc[df.ID == 103, ['fname', 'lname']] = 'Michael', 'Johnson'”之间,您有其他代码行将列表对象分配给df。检查那段代码以找到错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接