2013-10-09 49 views
0

我导入CSV作为数据框使用:Python的熊猫:解决“列出对象没有属性‘禄’”

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之前的版本中这不是问题(至少据我了解)。有任何想法吗?

+0

该语法适用于我 - 如果您提供可重复的示例,那么它会更容易帮助,因为它可能取决于csv文件中数据的问题。 –

+0

是的也适用于我,您的csv样本可能会有所帮助。 – drexiya

回答

2

要从评论皮卡的数量相匹配禄分配工作得很好:“我这样做:”

df = [df.hc== 2] 

你所创造的有一个“掩码”:一个布尔值数组,表示索引的哪一部分满足您的条件。

要在条件过滤您的数据帧要做到这一点:

df = df[df.hc == 2] 

更明确的有点是这样的:

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

如果你想保持整个数据框,而且只想替换具体的值,有这样的替换方法:Python pandas equivalent for replace。另一种(性能明智的)方法是创建一个单独的DataFrame,其中from/to values为列,并使用pd.merge将其组合到现有的DataFrame中。和使用指标的设定值也可能:

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

但对于较大的一组取代了你想使用的另外两种方法中的一种,或使用“应用”与拉姆达函数(值转换) 。最后但并非最不重要的是:您可以使用.fillna('bla')快速填充NA值。

+0

非常感谢! – Parseltongue

0

回溯显示df是list而不是DataFrame,正如您在代码行中所预期的那样。

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

+0

你肮脏的狗是对的。我正在做'df = [df.hc == 2]',我想这是将它转换成一个列表?我如何DataFramify它? – Parseltongue

0

@有声答案是正确的。如果右手边列表替换元素

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 
相关问题