如何将单个项目添加到序列化的熊猫系列中。我知道这不是最有效的记忆方式,但我仍然需要这样做。
伴随着一些东西:
>> 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?
如何添加单个项目。这不是很有效,但遵循您的要求:
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 问题的答案和参考,在 pandas.DataFrame 中添加一行。
TLDR:不要将项目一个一个地附加到一个系列中,最好使用有序集合进行扩展
我认为目前形式的问题有点棘手。接受的答案确实回答了这个问题。但是我使用熊猫的次数越多,我就越明白将项目逐个附加到系列是一个坏主意。我将尝试为熊猫初学者解释为什么。
您可能认为将数据附加到给定的系列可能允许您重用一些资源,但实际上系列只是一个容器,用于存储索引和值数组之间的关系。每个都是引擎盖下的 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
如果你有一个索引和值。然后你可以添加到系列:
obj = Series([4,7,-5,3])
obj.index=['a', 'b', 'c', 'd']
obj['e'] = 181
这将为系列添加一个新值(在系列结束时)。
您可以使用 append 函数向其中添加另一个元素。只是,在追加之前制作一系列新元素:
test = test.append(pd.Series(200, index=[101]))
至于@joaqin 的解决方案已被弃用,因为set_value
方法将在未来的熊猫版本中删除,我会提到另一个选项,即使用.at[]
访问器将单个项目添加到熊猫系列。
>>> 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
添加到 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
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))
这是在一行中附加多个项目而不更改系列名称的另一种想法。但是,这可能不如其他答案有效。
>>> 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