【问题标题】:When should I use dt.column vs dt['column'] pandas?我什么时候应该使用 dt.column vs dt['column'] pandas?
【发布时间】:2017-12-01 13:19:26
【问题描述】:

我正在做一些计算和行操作,并意识到对于某些任务,例如数学运算,它们都可以工作,例如

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

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

【问题讨论】:

  • 您应该始终使用[] 而不是. 来访问列,这样可以避免错误,例如您的列名有空格,它们共享名称作为方法等。

标签: python pandas


【解决方案1】:

您真的应该停止将列作为属性访问,并养成使用方括号[] 访问的习惯。这样可以避免列名包含 illegal characters in python、嵌入空格(列名与内置方法共享相同名称)以及不明确的用法(例如,列名为 index)的错误:

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

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

它失败了,因为它是一个无效的名称,但 df['2'] 可以工作

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 上失败

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 只是漂亮地打印它

In[17]:
df.index

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

上面我们的意图不明确,因为索引是它返回的成员而不是列'index'

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

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 2019-11-04
    • 2015-03-09
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多