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