我在数据集中创建了一个新列,如下所示:
df['new_col'] = [ True if v > 0 else False for v in df.old_col ]
当我在新列上调用value_counts()时,它只在我执行
时有效df['new_col'].value_counts() # works fine
但
df.new_col.value_counts()
给出了这个错误:
AttributeError: 'list' object has no attribute 'value_counts'
我很困惑为什么会发生这种情况......我不能在新列上使用点语法吗?任何建议都非常感谢,谢谢!
答案 0 :(得分:0)
正如Alexander所说,看起来你已经设置了属性而不是新系列。您必须使用括号表示法分配新列:
In [11]: df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
In [12]: df['C'] = [1, 2]
In [13]: type(df.C)
Out[13]: pandas.core.series.Series
没有它你只是分配一个属性(而且熊猫不知道你希望这个是一个列):
In [14]: df.D = [1, 2]
In [15]: type(df.D)
Out[15]: list
您无法使用括号表示法访问此属性:
In [16]: df['D']
KeyError: 'D'
出于这个原因,我喜欢在整个代码中使用括号始终,这样我 - 和读者 - 知道它是一列......(explicit is better than implicit)
注意:这实际上是非常有用的行为,因为(一方面)它允许您将元数据设置为DataFrame。同样,您可以将属性(或方法)分配给pd.DataFrame
,以便可以将其用于任何DataFrame。
In [21]: pd.DataFrame.x = 1
In [22]: df.x
Out[22]: 1
(这有时可能很有用,但请谨慎使用!!!)