TLDR:不要将项目逐个附加到一个系列中,最好使用有序集合进行扩展
我认为当前形式的问题有点棘手。接受的答案确实回答了这个问题。但是我使用熊猫的次数越多,我就越明白将项目逐个附加到系列是一个坏主意。我将尝试为 pandas 初学者解释原因。
您可能认为将数据附加到给定系列可能允许您重用某些资源,但实际上系列只是一个容器,用于存储索引和值数组之间的关系。每个都是引擎盖下的 numpy.array,并且索引是不可变的。当您向 Series 添加索引中缺少标签的项目时,将创建一个大小为 n+1 的新索引,并创建一个相同大小的新值值数组。这意味着,当您一个接一个地追加项目时,您会在每一步中再创建两个大小为 n+1 的数组。
顺便说一下,你不能按位置追加一个新项目(你会得到一个 IndexError)并且索引中的标签不必是唯一的,也就是说,当你用标签分配一个值时,你分配对所有带有标签的现有项目的值,并且在这种情况下不附加新行。这可能会导致细微的错误。
这个故事的寓意是你不应该一个一个地附加数据,你应该更好地扩展一个有序的集合。问题是您不能就地扩展系列。这就是为什么最好组织您的代码,这样您就不需要通过引用来更新 Series 的特定实例。
如果您自己创建标签并且它们正在增加,最简单的方法是将新项目添加到字典中,然后从字典中创建一个新系列(它对键进行排序)并将系列附加到旧系列。如果键没有增加,那么您需要为新标签和新值创建两个单独的列表。
以下是一些代码示例:
In [1]: import pandas as pd
In [2]: import numpy as np
In [3]: s = pd.Series(np.arange(4)**2, index=np.arange(4))
In [4]: s
Out[4]:
0 0
1 1
2 4
3 9
dtype: int64
In [6]: id(s.index), id(s.values)
Out[6]: (4470549648, 4470593296)
当我们更新一个现有的项目时,索引和值数组保持不变(如果你不改变值的类型)
In [7]: s[2] = 14
In [8]: id(s.index), id(s.values)
Out[8]: (4470549648, 4470593296)
但是当你添加一个新项目时,会生成一个新的索引和一个新的值数组:
In [9]: s[4] = 16
In [10]: s
Out[10]:
0 0
1 1
2 14
3 9
4 16
dtype: int64
In [11]: id(s.index), id(s.values)
Out[11]: (4470548560, 4470595056)
也就是说,如果您要附加多个项目,将它们收集到字典中,创建一个系列,将其附加到旧的并保存结果:
In [13]: new_items = {item: item**2 for item in range(5, 7)}
In [14]: s2 = pd.Series(new_items)
In [15]: s2 # keys are guaranteed to be sorted!
Out[15]:
5 25
6 36
dtype: int64
In [16]: s = s.append(s2); s
Out[16]:
0 0
1 1
2 14
3 9
4 16
5 25
6 36
dtype: int64