如何将单个物品添加到Pandas系列中[副本]

w6mmgewl  于 2023-01-04  发布在  其他
关注(0)|答案(8)|浏览(101)
    • 此问题在此处已有答案**:

Creating an empty Pandas DataFrame, and then filling it(8个答案)
6个月前关闭。
如何向Pandas Series示例添加单个项目?
我在寻找类似于

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

jei2mxaa

jei2mxaa1#

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

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

rdrgkggo

rdrgkggo2#

  • TLDR:不要一个接一个地向序列追加项,最好使用有序集合进行扩展 *

我认为这个问题目前的形式有点棘手。而且公认的答案确实回答了这个问题。但是我使用panda越多,就越明白一个接一个地把项目附加到Series中是个坏主意。我将尝试为panda初学者解释为什么。
您可能认为将数据追加到给定的Series可能允许您重用某些资源,但实际上Series只是存储索引和值数组之间关系的容器。每个数组都是一个numpy.array,并且索引是不可变的。当您向Series添加索引中缺少标签的项时,将创建大小为n+1的新索引。和一个相同大小的新的values values数组。这意味着当你一个接一个地追加项目时,你在每一步上都会多创建两个n+1大小的数组。
顺便说一下,你不能按位置追加一个新的项(你会得到一个IndexError),并且索引中的标签不必是唯一的,也就是说,当你用一个标签赋值时,你把这个值赋给了所有现有的带有这个标签的项,在这种情况下不会追加一个新行,这可能会导致一些微妙的bug。
这个故事的寓意是,你不应该一个接一个地追加数据,你应该更好地使用有序集合进行扩展。问题是你不能就地扩展Series。这就是为什么最好组织你的代码,这样你就不需要通过引用更新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)

也就是说,如果您要追加几个项目,将它们收集到字典中,创建一个Series,将其追加到旧的Series中,然后保存结果:

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
8hhllhi2

8hhllhi23#

如果您有一个索引和值。那么您可以添加到系列作为:

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

obj['e'] = 181

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

slsn1g29

slsn1g294#

您可以使用append函数向其添加另一个元素。不过,在添加新元素之前,请创建一系列新元素:

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

qgzx9mmu5#

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

>>> 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
ssgvzors

ssgvzors6#

在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
ktecyv1j

ktecyv1j7#

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))
ncecgwcz

ncecgwcz8#

下面是另一种方法,可以在一行中追加多个项目而不改变序列的名称。然而,这可能不如另一种方法有效。

>>> 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

相关问题