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

时间:2016-03-07 17:38:55

标签: python pandas

我运行了以下Python代码,它创建了一个包含两个系列(ab)的Pandas DataFrame,然后尝试创建两个新系列(c和{{1 }}):

d

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

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

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

还有一个新对象d,它是一个Pandas系列:

>>> df
   a  b  c
0  1  4  5
1  2  5  7
2  3  6  9

我的问题如下:

  • 为什么第4行不会导致错误?
  • df.d现在是“正常”的Pandas系列,具有所有常规系列功能吗?
  • >>> df.d 0 5 1 7 2 9 dtype: int64 >>> type(df.d) pandas.core.series.Series 以任何方式“连接”到df.d DataFrame,还是完全独立的对象?

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

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

2 个答案:

答案 0 :(得分:6)

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

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

df.some_property = 'What?'
>>> df.some_property
'What?'

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

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

答案 1 :(得分:1)

@ Alexander的答案很好。但只是为了澄清,它不是大熊猫的特异性,而是蟒蛇的特异性,请参阅此处的相关问题:

Why is adding attributes to an already instantiated object allowed in Python?

至于你的上一个问题,系列没有连接(取决于你连接的意思)。但是,想象一下:

df = pd.DataFrame({'a':[1, 2, 3], 'b':[4, 5, 6]})
df.d = df.a + df.b
df.sort("a", ascending=False, inplace=True)
df
   a  b
2  3  6
1  2  5
0  1  4

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

所以df.d尚未排序,而df.adf.b则排序。