使用名称中的句点创建Pandas系列

Kev*_*ham 5 python pandas

我运行了以下Python代码,它创建了一个带有两个Series(a和b)的Pandas DataFrame ,然后尝试创建两个新的Series(c和d):

import pandas as pd
df = pd.DataFrame({'a':[1, 2, 3], 'b':[4, 5, 6]})
df['c'] = df.a + df.b
df.d = df.a + df.b
Run Code Online (Sandbox Code Playgroud)

我的理解是,如果Pandas系列是DataFrame的一部分,并且Series名称没有任何空格(并且不与现有属性或方法冲突),则可以作为DataFrame的属性访问Series.因此,我预计第3行会起作用(因为这就是你创建一个新的Pandas系列的方式),我预计第4行会失败(因为d在你执行那行代码之前,DataFrame 的属性不存在).

令我惊讶的是,第4行没有导致错误.相反,DataFrame现在包含三个系列:

>>> df
   a  b  c
0  1  4  5
1  2  5  7
2  3  6  9
Run Code Online (Sandbox Code Playgroud)

还有一个新对象,df.d就是熊猫系列:

>>> df.d
0    5
1    7
2    9
dtype: int64

>>> type(df.d)
pandas.core.series.Series
Run Code Online (Sandbox Code Playgroud)

我的问题如下:

  • 为什么第4行不会导致错误?
  • 是df.d现在"正常"熊猫系列所有的常规系列的功能?
  • 是否df.d以任何方式"连接"到df数据帧,或者是一个完全独立的对象?

我提出这个问题的动机很简单,我想更好地了解熊猫,而不是因为第4行有一个特定的用例.

我的Python版本是2.7.11,而我的Pandas版本是0.17.1.

Ale*_*der 7

在进行分配时,您需要使用括号表示法,例如 df['d'] = ...

d现在是数据帧的属性df.与任何对象一样,您可以为它们指定属性.这就是它没有产生错误的原因.它只是没有你预期的表现......

df.some_property = 'What?'
>>> df.some_property
'What?'
Run Code Online (Sandbox Code Playgroud)

对于熊猫初学者来说,这是一个常见的误解区域. 始终使用括号表示法进行分配.在引用数据框/系列时,点符号是为了方便起见.为安全起见,您可以始终使用括号表示法.

是的,df.d根据您的示例,这是一个正常的系列,现在是数据帧的意外属性.此系列是它自己的对象,由您在分配时创建的引用连接df.