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' object has no attribute 'loc'

请注意,当我这样做时,print pd.version()我会得到 0.12.0,因此拥有 11 之前的版本不是问题(至少据我所知)。有任何想法吗?

4

3 回答 3

5

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

df = [df.hc== 2]

您在那里创建的是一个“掩码”:一个带有布尔值的数组,表示索引的哪一部分满足您的条件。

要根据您的条件过滤数据框,您需要执行以下操作:

df = df[df.hc == 2]

更明确一点的是:

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

如果您想保留整个数据框并且只想替换特定值,可以使用 replace 等方法:Python pandas 等效于 replace。另一种(性能明智的)方法是创建一个单独的 DataFrame,其中 from/to 值作为列,并使用 pd.merge 将其组合到现有的 DataFrame 中。并且使用您的索引来设置值也是可能的:

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

但是对于更大的替换集,您可能希望使用其他两种方法之一,或者将“应用”与 lambda 函数一起使用(用于值转换)。最后但同样重要的是:您可以使用 .fillna('bla') 快速填充 NA 值。

于 2013-10-09T17:48:33.647 回答
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
于 2013-10-09T12:26:03.593 回答
1

回溯向您表明 df 是 alist而不是 aDataFrame在您的代码行中的预期。

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

于 2013-10-09T12:20:32.243 回答