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

Posted

技术标签:

【中文标题】如何将单个项目添加到 Pandas 系列【英文标题】:How to add a single item to a Pandas Series 【发布时间】:2012-10-31 03:45:50 【问题描述】:

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

一些东西:

>> 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 DataFrame 添加一行?

【问题讨论】:

相关:Creating an empty Pandas DataFrame, then filling it? - TLDR 建立一个列表,然后在最后转换为一个系列。 【参考方案1】:

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

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 的答案和参考。

【讨论】:

你用的是什么版本的熊猫?我正在使用 0.14.1,但出现以下错误:IndexError: index 0 is out of bounds for axis 0 with size 0 @Ben,不确定,答案超过 2 岁。我用 0.15.0 测试过,效果很好。您是否正在执行完全相同的代码 是的,我只是将代码直接粘贴到新的控制台中。奇怪的是,它现在似乎起作用了! 在python > 3中,你不需要x = x.set_value(i, i**2),因为x.set_value()直接改变了x 是的,不推荐使用 set_value()。使用x.at[i] = i**2x.iat[i] = i**2【参考方案2】:

您可以使用 append 函数向其中添加另一个元素。只是,在追加之前制作一系列新元素:

test = test.append(pd.Series(200, index=[101]))

【讨论】:

我相信 append 返回一个新系列(而不是就地执行)所以你想要test = test.append(pd.Series(200, index=[101])) @A.Wan 是的,应该更清楚地说明这一点。谢谢! 我比test.at[i] = i**2 方法更喜欢这个方法,因为该方法似乎按字母顺序插入新值,而这直接将值附加到末尾,这正是我想要的。【参考方案3】:

在 joquin 的回答中添加以下形式可能会更简洁一些(至少更易于阅读):

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

这将产生相同的输出

另外,有点不正统,但如果你想简单地在末尾添加一个元素:

x=p.Series()
value_to_append=5
x[len(x)]=value_to_append

【讨论】:

第二部分代码在python 3中不起作用【参考方案4】:

如果你有一个索引和值。然后您可以将系列添加为:

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

obj['e'] = 181

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

【讨论】:

很好的答案,简短而直接。 这是最好的答案【参考方案5】:

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

【讨论】:

应该注意append返回一个新变量,而赋值修改数据框。虽然所有的底层证券都在变化,但参考是一样的。【参考方案6】:

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

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

它产生相同的输出。

>>> print(x)
0    0
1    1
2    4
3    9

【讨论】:

【参考方案7】:

这是另一种想法,即在一行中附加多个项目而不更改系列名称。但是,这可能不如其他答案有效。

>>> df = pd.Series(np.random.random(5), name='random')
>>> df

0    0.363885
1    0.402623
2    0.450449
3    0.172917
4    0.983481
Name: random, dtype: float64


>>> df.to_frame().T.assign(a=3, b=2, c=5).squeeze()

0    0.363885
1    0.402623
2    0.450449
3    0.172917
4    0.983481
a    3.000000
b    2.000000
c    5.000000
Name: random, dtype: float64

【讨论】:

【参考方案8】:
import pandas as pd
import numpy as np

ser1 = pd.Series(np.linspace(1, 10, 2))
element = np.nan
ser1 = ser1.append(pd.Series(element))

【讨论】:

以上是关于如何将单个项目添加到 Pandas 系列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Pandas 将多索引系列加入单个索引数据框?

如何将一系列数组转换为 pandas/numpy 中的单个矩阵?

将项目添加到 pandas.Series?

将单个项目附加到熊猫系列中的列表

是否可以将不在图表上的项目添加到图例中?

如何将单个项目附加到其他可排序列表