Python Pandas:解析“List Object没有属性'Loc'”

时间:2013-10-09 08:31:29

标签: python pandas

我使用以下方法将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之前的版本时,这不是问题(至少据我所知)。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

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

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函数的“apply”(用于值转换)。最后但并非最不重要:您可以使用.fillna('bla')快速填充NA值。

答案 1 :(得分:0)

回溯向您显示df是您的代码行中预期的list而不是DataFrame

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

答案 2 :(得分:0)

@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