如何将单个项目添加到Pandas系列

era*_*ran 61 python pandas

如何将单个项目添加到序列化的熊猫系列中.我知道这不是最有效的记忆方式,但我仍然需要这样做.

一些东西:

>> 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
Run Code Online (Sandbox Code Playgroud)

另外,我如何向pandas DataFrame添加一行?

joa*_*uin 40

如何添加单个项目.这不是很有效,但遵循您的要求:

x = p.Series()
N = 4
for i in xrange(N):
   x = x.set_value(i, i**2)
Run Code Online (Sandbox Code Playgroud)

产生x:

0    0
1    1
2    4
3    9
Run Code Online (Sandbox Code Playgroud)

显然有更好的方法可以一次性生成这个系列.

对于您的第二个问题,检查答案和SO问题的参考在pandas.DataFrame中添加一行.

  • 是的,不推荐使用set_value().使用`x.at [i] = i**2`或`x.iat [i] = i**2`. (6认同)

new*_*ver 30

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

我认为目前形式的问题有点棘手.接受的答案确实回答了这个问题.但是我越多地使用大熊猫,我就越了解将一个项目逐个添加到系列中是一个坏主意.我会尝试解释为什么熊猫初学者.

您可能认为将数据附加到给定系列可能允许您重用某些资源,但实际上,Series只是一个存储索引和值数组之间关系的容器.每个都是引擎盖下的numpy.array,索引是不可变的.向系列添加索引中缺少标签的项目时,会创建一个大小为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)
Run Code Online (Sandbox Code Playgroud)

当我们更新现有项时,索引和值数组保持不变(如果不更改值的类型)

In [7]: s[2] = 14  

In [8]: id(s.index), id(s.values)
Out[8]: (4470549648, 4470593296)
Run Code Online (Sandbox Code Playgroud)

但是当您添加新项目时,会生成一个新索引和一个新值数组:

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)
Run Code Online (Sandbox Code Playgroud)

也就是说,如果要添加多个项目,将它们收集到字典中,创建一个系列,将其附加到旧系列并保存结果:

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
Run Code Online (Sandbox Code Playgroud)


use*_*683 15

如果您有索引和值.然后你可以添加到系列:

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

obj['e'] = 181
Run Code Online (Sandbox Code Playgroud)

这将为Series增加一个新值(在系列的末尾).

  • 这是最好的答案 (4认同)
  • 很好的答案,简短而直接。 (2认同)

fix*_*xer 12

您可以使用append函数向其添加另一个元素.只有在添加它之前制作一系列新元素:

test.append(pd.Series(200, index=[101]))
Run Code Online (Sandbox Code Playgroud)

  • 我相信append返回一个新的Series(而不是就地执行),因此您需要`test = test.append(pd.Series(200,index = [101]))` (2认同)

der*_*ers 8

添加到joquin的答案,以下表格可能会更清晰(至少更好阅读):

x = p.Series()
N = 4
for i in xrange(N):
   x[i] = i**2
Run Code Online (Sandbox Code Playgroud)

这将产生相同的输出

也有点不那么正统,但如果你想简单地添加一个元素到最后:

x=p.Series()
value_to_append=5
x[len(x)]=value_to_append
Run Code Online (Sandbox Code Playgroud)


Jar*_*děk 5

至于@joaqin 的解决方案已被弃用,因为set_value方法将在未来的Pandas版本中删除,我会提到使用.at[]访问器向 Pandas 系列添加单个项目的另一个选项。

>>> import pandas as pd
>>> x = pd.Series()
>>> N = 4
>>> for i in range(N):
...     x.at[i] = i**2
Run Code Online (Sandbox Code Playgroud)

它产生相同的输出。

>>> print(x)
0    0
1    1
2    4
3    9
Run Code Online (Sandbox Code Playgroud)