如何向Pandas Series添加单个项目

2024-04-27 04:31:17 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将单个项添加到序列化的panda系列中。我知道这不是记忆方面最有效的方法,但我仍然需要这样做。

一些事情:

>> x = Series()
>> N = 4
>> for i in xrange(N):
>>     x.some_appending_function(i**2)    
>> print x

0 | 0
1 | 1
2 | 4
3 | 9

另外,如何向pandas数据帧添加一行?


Tags: 数据方法记忆inpandasfor序列化function
3条回答

TLDR:不要逐个将项目附加到序列中,最好使用有序集合进行扩展

我认为现在的问题有点棘手。接受的答案确实回答了这个问题。但我使用熊猫的次数越多,我就越明白,一个接一个地将项目附加到一个系列中是个坏主意。我试着向熊猫初学者解释为什么。

您可能认为将数据附加到给定的序列可能允许您重用某些资源,但实际上序列只是存储索引和值数组之间关系的容器。每一个都是引擎盖下的numpy.array,并且索引是不可变的。向序列中添加索引中缺少标签的项时,将创建一个大小为n+1的新索引,以及一个大小相同的新值值数组。这意味着,当逐个追加项时,在每个步骤上再创建两个n+1大小的数组。

顺便说一句,您不能按位置追加新项(您将得到一个索引器错误),索引中的标签也不必是唯一的,也就是说,当您使用标签分配值时,您使用标签将该值分配给所有现有项,在这种情况下不会追加新行。这可能会导致微小的虫子。

这个故事的寓意是,您不应该一个接一个地追加数据,您最好使用有序的集合进行扩展。问题是你不能把一个序列扩展到原来的位置。这就是为什么最好组织代码,这样就不需要通过引用更新序列的特定实例。

如果您自己创建标签,并且标签数量在增加,最简单的方法是将新项添加到字典中,然后从字典中创建一个新序列(它对键进行排序),并将序列附加到旧序列。如果键没有增加,则需要为新标签和新值创建两个单独的列表。

下面是一些代码示例:

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

如何添加单个项目。这不是很有效,但符合您的要求:

x = p.Series()
N = 4
for i in xrange(N):
   x = x.set_value(i, i**2)

产生x:

0    0
1    1
2    4
3    9

显然,有更好的方法来产生这个系列只有一个镜头。

对于您的第二个问题,请检查SO问题add one row in a pandas.DataFrame的答案和引用。

如果你有一个索引和值。然后可以添加到序列:

obj = Series([4,7,-5,3])
obj.index=['a', 'b', 'c', 'd']

obj['e'] = 181

这将为系列(系列末尾)添加一个新值。

相关问题 更多 >