用Python进行数据分析 第五章 Pandas入门 Day10

5.2.4 整数索引

pandas对象使用上用整数索引时经常会产生歧义,这是因为它和在列表,元祖等Python内建数据结构上进行索引有些不同。下面的代码就会发生错误

In [20]: ser=pd.Series(np.arange(3.))

In [21]: ser
Out[21]: 
0    0.0
1    1.0
2    2.0
dtype: float64
In [24]: ser[-1]
In [25]: Traceback (most recent call last):

  File "/Applications/Spyder.app/Contents/Resources/lib/python3.9/pandas/core/indexes/range.py", line 351, in get_loc
    return self._range.index(new_key)

ValueError: -1 is not in range


The above exception was the direct cause of the following exception:

Traceback (most recent call last):

  File "<ipython-input-24-44969a759c20>", line 1, in <module>
    ser[-1]

  File "/Applications/Spyder.app/Contents/Resources/lib/python3.9/pandas/core/series.py", line 853, in __getitem__
    return self._get_value(key)

  File "/Applications/Spyder.app/Contents/Resources/lib/python3.9/pandas/core/series.py", line 961, in _get_value
    loc = self.index.get_loc(label)

  File "/Applications/Spyder.app/Contents/Resources/lib/python3.9/pandas/core/indexes/range.py", line 353, in get_loc
    raise KeyError(key) from err

在上面的例子中,pandas可以退回到整数索引,但是这样的方式难免会引起一些错误。
假设我们有一个索引,它包含了0,1,2,但是要猜测用户所需要的索引方法(标签索引还是位置索引)是很难的。
然而,非整数索引,不会有潜在的歧义.

In [26]: ser2=pd.Series(np.arange(3.),index=['a','b','c'])

In [27]: ser2[-1]
Out[27]: 2.0

为了保持一致性,如果我们有一个包含整数的轴索引,数据选择时请始终使用标签索引。
为了更精确的处理,可以使用loc或者iloc

In [28]: ser[:1]
Out[28]: 
0    0.0
dtype: float64
In [29]: ser.loc[:1]
Out[29]: 
0    0.0
1    1.0
dtype: float64
In [30]: ser.iloc[:1]
Out[30]: 
0    0.0
dtype: float64

5.2.5 算术和数据对齐

这一节的内容并不难理解。
当你将两个有索引的数据相加时,如果存在某个索引对不相同,则返回结果的索引将是索引对的并集。对数据库用户来说,这个特性类似于标签的自动外连接(outer join)。让我们看一下下面的示例。

In [31]: s1=pd.Series([7.3,-2.5,3.4,1.5],index=['a','c','d','e'])

In [32]: s2=pd.Series([-2.1,3.6,-1.5,4,3.1],
    ...:              index=['a','c','e','f','g'])

In [33]: s1+s2
Out[33]: 
a    5.2
c    1.1
d    NaN
e    0.0
f    NaN
g    NaN
dtype: float64

索引重合的地方计算没问题,不重合的地方会返回NaN。

In [41]: df1=pd.DataFrame(np.arange(9.).reshape((3,3)),columns=list('bcd'),
    ...:                 index=['Ohio','Texas','Colorado'])

In [42]: df2=pd.DataFrame(np.arange(12.).reshape((4,3)),columns=list('bde'),
    ...:                 index=['Utah','Ohio','Texas','Oregon'])

In [43]: df1
Out[43]: 
            b    c    d
Ohio      0.0  1.0  2.0
Texas     3.0  4.0  5.0
Colorado  6.0  7.0  8.0

In [44]: df2
Out[44]: 
          b     d     e
Utah    0.0   1.0   2.0
Ohio    3.0   4.0   5.0
Texas   6.0   7.0   8.0
Oregon  9.0  10.0  11.0

In [45]: df1+df2
Out[45]: 
            b   c     d   e
Colorado  NaN NaN   NaN NaN
Ohio      3.0 NaN   6.0 NaN
Oregon    NaN NaN   NaN NaN
Texas     9.0 NaN  12.0 NaN
Utah      NaN NaN   NaN NaN

由于'c'和 'e' 列并不是两个DataFrame共有的列,这两列中产生了缺失值。对于行标签不同的DataFrame对象也是如此。
如果你将两个行或列完全不同的DataFrame对象相加,结果将全部为空。

In [1]: import pandas as pd

In [2]: df1=pd.DataFrame({'A':[1,2]})

In [3]: df2=pd.DataFrame({'B':[3,4]})

In [4]: df1
Out[4]: 
   A
0  1
1  2

In [5]: df2
Out[5]: 
   B
0  3
1  4

In [6]: df1-df2
Out[6]: 
    A   B
0 NaN NaN
1 NaN NaN

5.2.5.1 使用填充值的算术方法

在两个不同的索引化对象之间进行算数操作时,会用到使用特殊填充值,比如当轴标签在一个对象中不存在时,可以把缺失值填充为0。

In [16]: df1=pd.DataFrame(np.arange(12.).reshape((3,4)),
    ...:                  columns=list('abcd'))

In [17]: df2=pd.DataFrame(np.arange(20.).reshape((4,5)),
    ...:                  columns=list('abcde'))

In [18]: df2.loc[1,'b']=np.nan

In [19]: df1
Out[19]: 
     a    b     c     d
0  0.0  1.0   2.0   3.0
1  4.0  5.0   6.0   7.0
2  8.0  9.0  10.0  11.0

In [20]: df2
Out[20]: 
      a     b     c     d     e
0   0.0   1.0   2.0   3.0   4.0
1   5.0   NaN   7.0   8.0   9.0
2  10.0  11.0  12.0  13.0  14.0
3  15.0  16.0  17.0  18.0  19.0

将这些df添加到一起会导致在一些不重叠的位置出现NA值。

In [21]: df1+df2
Out[21]: 
      a     b     c     d   e
0   0.0   2.0   4.0   6.0 NaN
1   9.0   NaN  13.0  15.0 NaN
2  18.0  20.0  22.0  24.0 NaN
3   NaN   NaN   NaN   NaN NaN

表5.5列出了Series和DataFrame的算术方法。这些方法中的每一个都有一个以r开头的副本。

表5.5

211007

5.2.5.2 DataFrame和Series之间的操作

DataFrame和Series之间的算数操作与Numpy中不同纬度数组之间的操作类似。

In [13]: arr=np.arange(12.).reshape((3,4))

In [14]: arr
Out[14]: 
array([[ 0.,  1.,  2.,  3.],
       [ 4.,  5.,  6.,  7.],
       [ 8.,  9., 10., 11.]])

In [15]: arr[0]
Out[15]: array([0., 1., 2., 3.])

In [16]: arr-arr[0]
Out[16]: 
array([[0., 0., 0., 0.],
       [4., 4., 4., 4.],
       [8., 8., 8., 8.]])

在上面的例子里,当我们从arr中减去arr[0]时,减法在每一行都进行了操作。这就是所谓的广播机制。DataFrame和Series之间的操作是类似的。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容