Как добавить один элемент в серию Pandas

Как добавить один элемент в сериализованную серию 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 DataFrame?

Ответ 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 question добавьте одну строку в pandas.DataFrame.

Ответ 2

TL;DR: не добавляйте элементы к серии один за другим, лучше расширяйтесь с помощью упорядоченной коллекции

Я думаю, что вопрос в его нынешнем виде немного сложнее. И принятый ответ отвечает на вопрос. Но чем больше я использую pandas, тем больше я понимаю, что это плохая идея добавлять элементы в серию один за другим. Я попытаюсь объяснить, почему для начинающих pandas.

Вы можете подумать, что добавление данных к данной серии может позволить вам повторно использовать некоторые ресурсы, но на самом деле серия - это просто контейнер, в котором хранится связь между индексом и массивом значений. Каждый из них является numpy.array под капотом, а индекс неизменен. Когда вы добавляете в Series элемент с меткой, отсутствующей в индексе, создается новый индекс с размером n + 1, а новый массив значений имеет тот же размер. Это означает, что при добавлении элементов один за другим вы создаете еще два массива размера n + 1 на каждом шаге.

Кстати, вы не можете добавить новый элемент по позиции (вы получите IndexError), а метка в индексе не должна быть уникальной, то есть когда вы назначаете значение с меткой, вы назначаете значение для всех существующих элементов с меткой, а новая строка не добавляется в этом случае. Это может привести к незначительным ошибкам.

Мораль этой истории состоит в том, что вам не следует добавлять данные один за другим, лучше расширить их с помощью упорядоченной коллекции. Проблема в том, что вы не можете расширить серию inplace. Поэтому лучше организовать свой код, чтобы вам не нужно было обновлять конкретный экземпляр серии по ссылке.

Если вы создаете ярлыки самостоятельно, и они растут, самый простой способ - добавить новые слова в словарь, затем создать новую серию из словаря (сортирует ключи) и добавить серию в старую. Если ключи не увеличиваются, вам необходимо создать два отдельных списка для новых меток и новых значений.

Ниже приведены примеры кода:

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

Ответ 3

Вы можете использовать функцию добавления, чтобы добавить к ней еще один элемент. Только сделайте серию нового элемента, прежде чем добавить его:

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

Ответ 4

Если у вас есть индекс и значение. Затем вы можете добавить в Серию как:

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

obj['e'] = 181

это добавит новое значение в Series (в конце серии).

Ответ 5

Добавление в 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

Ответ 6

Поскольку решение @joaqin устарело, поскольку метод set_value будет удален в будущем выпуске pandas, я бы упомянул другой вариант добавления одного элемента в серию pandas с использованием средства доступа .at[].

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

Он производит тот же результат.

In [2]: x
Out[2]: 0    0
        1    1
        2    4
        3    9