>>> df.c = df.a + df.b
__main__:1: UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access`
df = pd.DataFrame(data={'A':[1, 2, 3],
'B':[4,5,6]})
# this has no effect
df.D = 11
df
A B
0 1 4
1 2 5
2 3 6
# but this works
df['D'] = 11
df
Out[19]:
A B D
0 1 4 11
1 2 5 11
2 3 6 11
df = pd.DataFrame({'min':[1,2], 'max': ['a','a'], 'class': [1975, 1981], 'sum': [3,4]})
print(df)
min max class sum
0 1 a 1975 3
1 2 a 1981 4
看起来一切正常,没有错误。您甚至可以通过df['min']等访问列...
print(df['min'])
0 1
1 2
Name: min, dtype: int64
但是,如果您尝试使用df.<column_name>,则会遇到问题:
print(df.min)
<bound method NDFrame._add_numeric_operations.<locals>.min of min max class sum
0 1 a 1975 3
1 2 a 1981 4>
print(df.max)
<bound method NDFrame._add_numeric_operations.<locals>.max of min max class sum
0 1 a 1975 3
1 2 a 1981 4>
print(df.class)
File "<ipython-input-31-3472b02a328e>", line 1
print(df.class)
^
SyntaxError: invalid syntax
print(df.sum)
<bound method NDFrame._add_numeric_operations.<locals>.sum of min max class sum
0 1 a 1975 3
1 2 a 1981 4>
5条答案
按热度按时间pjngdqdw1#
“点标记”,即
df.col2
是为了方便而公开的属性访问。您可以将Series上的索引、DataFrame上的列以及Panel上的项目直接作为属性进行访问:
df['col2']
执行相同的操作:它返回列的pd.Series
。关于属性访问的一些警告:
df.new_col = x
不起作用,更糟的是:它将静默地实际创建一个新属性,而不是一个列-在这里考虑monkey-patching)bbuxkriu2#
只要您访问的是名称简单的单列,它们就相同,但是您可以使用括号表示法执行更多操作。仅当列名是有效的Python标识符时,才可以使用
df.col
(例如,不包含空格和其它这样的东西)。而且,如果列名与panda方法名冲突,可能会遇到意外情况使用方括号可以选择多个列(例如df[['col1', 'col2']]
)或添加新列(df['newcol'] = ...
),而点访问无法实现这一点。你链接到的另一个问题也适用,但这是一个更一般的问题。Python对象可以定义
.
和[]
操作符如何应用于它们。Pandas DataFrames已经选择让它们在访问单列的有限情况下保持相同,并给出了上述警告。0sgqnhkj3#
差异的简短回答:
[]
索引**(方括号访问)具有操作DataFrame列数据的完整功能。更多说明
Series和DataFrame是panda的核心类和数据结构,当然它们也是Python类,所以在涉及panda DataFrame和普通Python对象之间的属性访问时,会有一些细微的区别。但是,这些都有很好的文档记录,很容易理解。这里有几点需要注意:
1.在Python中,用户可以使用属性访问将自己的数据属性动态添加到示例对象中。
1.在Pandas中,* index * 和 * column * 与数据结构密切相关,您可以访问Series上的索引、DataFrame上的列作为属性。
1.但是,Pandas属性访问主要是为了方便读取和修改数据框的Series或列的现有元素。
1.而且,方便性是完整功能的一个折衷,例如,你可以创建一个列名称为
['space bar', '1', 'loc', 'min', 'index']
的DataFrame对象,但是你不能将它们作为属性来访问,因为它们不是有效的Python标识符(1
,space bar
),或者与现有的属性名称冲突。1.在这些情况下,
.loc
、.iloc
和[]
索引是完全访问/操作Series和DataFrame对象的索引和列的定义方式。1.另一个重要的区别是当尝试为DataFrame创建一个新列时,如您所见,
df.c = df.a + df.b
只是在核心数据结构旁边创建了一个新属性,因此 * 从0.21.0
版本及更高版本开始,此行为将引发UserWarning
(不再是silent)。*1.最后,要为DataFrame创建新列,切勿使用属性访问。正确的方法是使用
[]
或.loc
索引:raogr8fs4#
.
表示法在交互式工作和探索时非常有用。但是,为了代码清晰和避免发生疯狂的事情,您绝对应该使用[]
表示法。下面是创建新列时为什么应该使用[]
的示例。x8goxv8g5#
如果您有这样的 Dataframe (我不推荐这些列名)...
看起来一切正常,没有错误。您甚至可以通过
df['min']
等访问列...但是,如果您尝试使用
df.<column_name>
,则会遇到问题: