Python:解析";列表对象没有属性';Loc'&引用;
我使用以下方法将CSV导入为数据帧:Python:解析";列表对象没有属性';Loc'&引用;,python,pandas,Python,Pandas,我使用以下方法将CSV导入为数据帧: 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” 注意,当我打印pd.version()时,我得到了0.12.0,所以使用11之前的版
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”
注意,当我打印pd.version()时,我得到了0.12.0,所以使用11之前的版本不是问题(至少据我所知)。有什么想法吗?回溯向您表明df是一个
列表
,而不是您的代码行中预期的数据帧
这意味着在df=pd.read\u csv(“test.csv”)
和df.loc[df.ID==103,['fname','lname']='Michael','Johnson'
之间有其他代码行将列表对象分配给df
。检查那段代码,找出你的bug,如果答案正确的话。如果右侧列表与替换元素的数量匹配,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
从评论中可以看出:“我正在做这件事:”
这里创建的是一个“掩码”:一个带有布尔值的数组,表示索引的哪个部分满足您的条件
要根据您的条件筛选数据帧,请执行以下操作:
df = df[df.hc == 2]
更明确一点是:
mask = df.hc == 2
df = df[mask]
如果您希望保留整个数据帧,并且只希望替换特定的值,则可以使用以下方法替换:。另外,另一种(从性能角度来看非常好的)方法是创建一个单独的数据帧,其中from/to值作为列,并使用pd.merge将其合并到现有的数据帧中。也可以使用索引设置值:
df[mask]['fname'] = 'Johnson'
但对于更大的替换集,您可能希望使用其他两种方法中的一种,或者使用lambda函数的“apply”(用于值转换)。最后但并非最不重要的一点:可以使用.fillna('bla')快速填充NA值 这种语法对我来说很好——如果你提供了一个可复制的示例,那么会更容易提供帮助,因为这可能取决于csv文件中的数据问题。是的,对我也适用,csv的示例可能会有所帮助。
df[mask]['fname'] = 'Johnson'