类型错误:'DataFrame'对象不可调用。

12

我已经编写了这些用于计算方差的程序。

credit_card = pd.read_csv("default_of_credit_card_clients_Data.csv", skiprows=1)
    
for col in credit_card:
    var[col]=np.var(credit_card(col))

我遇到了这个错误

Traceback (most recent call last):
   File "C:/Python34/project.py", line 11, in <module>
     var[col]=np.var(credit_card(col)) 
TypeError: 'DataFrame' object is not callable
3个回答

10

看起来你需要使用DataFrame.var

默认情况下,使用N-1进行标准化。可以使用ddof参数进行更改。

var1 = credit_card.var()

示例:

#random dataframe
np.random.seed(100)
credit_card = pd.DataFrame(np.random.randint(10, size=(5,5)), columns=list('ABCDE'))
print (credit_card)
   A  B  C  D  E
0  8  8  3  7  7
1  0  4  2  5  2
2  2  2  1  0  8
3  4  0  9  6  2
4  4  1  5  3  4

var1 = credit_card.var()
print (var1)
A     8.8
B    10.0
C    10.0
D     7.7
E     7.8
dtype: float64

var2 = credit_card.var(axis=1)
print (var2)
0     4.3
1     3.8
2     9.8
3    12.2
4     2.3
dtype: float64

如果需要使用numpy.var来解决问题:

print (np.var(credit_card.values, axis=0))
[ 7.04  8.    8.    6.16  6.24]

print (np.var(credit_card.values, axis=1))
[ 3.44  3.04  7.84  9.76  1.84]

差异是因为在 pandas 中默认情况下 ddof=1,但您可以将其更改为0:

var1 = credit_card.var(ddof=0)
print (var1)
A    7.04
B    8.00
C    8.00
D    6.16
E    6.24
dtype: float64

var2 = credit_card.var(ddof=0, axis=1)
print (var2)
0    3.44
1    3.04
2    7.84
3    9.76
4    1.84
dtype: float64

1

当您调用pandas DataFrame对象时,如果像调用类或函数一样使用圆括号(),则会出现此错误。简而言之,pandas DataFrames是类型为“DataFrame”的对象,其使对象可调用的属性为空。

例如,在OP中,罪魁祸首是:

credit_card(col)

因为之前,credit_card 被定义为 pandas DataFrame 对象,通过

credit_card = pd.read_csv("default_of_credit_card_clients_Data.csv", skiprows=1)

定义数据框最常见的方式是通过构造函数df = pd.DataFrame(data),并且这个df也不能被调用: df()会得到相同的错误。其他构造数据框对象的函数列表可以在pandas文档中找到。

这个问题本质上是一个打字错误。以下是一些常见的原因/解决方案:

  1. 如果您想选择数据框的某些列,请使用方括号[]
    credit_card[col]                # 例如 credit_card['colA'] 或 credit_card[['colA']]
    
  2. 如果您想调用数据框的方法,请在数据框名称后面写上方法名称,用点.隔开:
    credit_card.some_method(col)    # 例如 credit_card.value_counts('colA')
    
  3. 如果您的环境中有一个函数和一个数据框共享相同的名称。例如,
    credit_card = lambda x: x + 1
    credit_card = pd.DataFrame(data)
    
    在这种情况下,请确保使用不同的名称重新定义它们。

0
当我错误地使用boolean indexing时,我遇到了相同的错误。
self_views = views[views('author_id') == views('viewer_id')]

正确的语法是
self_views = views[views['author_id'] == views['viewer_id']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接