关于python:我什么时候应该使用dt.column vs dt [‘column’] pandas?

When should I use dt.column vs dt['column'] pandas?

我做了一些计算和行操作,并意识到对于一些任务,如数学运算,它们都能工作,例如。

1
2
d['c3'] = d.c1 / d. c2
d['c3'] = d['c1'] / d['c2']

我想知道在某些情况下,使用一个比另一个更好,或者大多数人使用什么。


您应该停止访问列作为属性,养成使用方括号[]访问的习惯。这样可以避免在python、嵌入空格中列名包含非法字符、列名与内置方法同名以及使用不明确(例如,如果列名为index)时出现错误:

1
2
3
4
5
In[13]:
df = pd.DataFrame(np.random.randn(5,4), columns=[' a', 'mean', 'index', '2'])
df.columns.tolist()

Out[13]: [' a', 'mean', 'index', '2']

因此,如果我们现在尝试访问列2

1
2
3
4
5
6
In[14]:
df.2
  File"<ipython-input-14-0490d6ae2ca0>", line 1
    df.2
       ^
SyntaxError: invalid syntax

它失败了,因为它是一个无效的名称,但df['2']会起作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
In[15]:

df.a
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-15-b9872a8755ac> in <module>()
----> 1 df.a

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
   3079             if name in self._info_axis:
   3080                 return self[name]
-> 3081             return object.__getattribute__(self, name)
   3082
   3083     def __setattr__(self, name, value):

AttributeError: 'DataFrame' object has no attribute 'a'

因此,因为这实际上是一个带前导空格的' a'(如果列名中有空格,这也会失败),所以它在KeyError上失败。

1
2
3
4
5
6
7
8
9
10
In[16]:
df.mean

Out[16]:
<bound method DataFrame.mean of           a      mean     index         2
0 -0.022122  1.858308  1.823314  0.238105
1 -0.461662  0.482116  1.848322  1.946922
2  0.615889 -0.285043  0.201804 -0.656065
3  0.159351 -1.151883 -1.858024  0.088460
4  1.066735  1.015585  0.586550 -1.898469>

这是更微妙的,看起来它做了一些事情,但实际上它只是返回方法地址,这里ipython只是很漂亮地打印它

1
2
3
4
In[17]:
df.index

Out[17]: RangeIndex(start=0, stop=5, step=1)

上面我们有模棱两可的意图,因为索引是一个成员,所以返回的不是列'index'

因此,您应该停止访问列作为属性,并始终使用方括号,因为这样可以避免上述所有问题。