У меня есть фреймворк:
s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])
df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"])
A B C
0 5 6 7
1 7 8 9
[2 rows x 3 columns]
и мне нужно добавить первую строку [2, 3, 4], чтобы получить:
A B C
0 2 3 4
1 5 6 7
2 7 8 9
Я пробовал append()
и concat()
функционирует, но не могу найти правильный способ это сделать.
Как добавить / вставить серию в фрейм данных?
s1.values
вместо того, чтобыlist(s1)
создавать совершенно новый список, используяlist(s1)
.Ответы:
Просто назначьте строку определенному индексу, используя
loc
:И вы получите по желанию:
См. В документации Pandas Индексирование: Настройка с увеличением .
источник
df.loc[-1] = df.iloc[[0]]
, и вставить ее? Фрейм идет с добавленным столбцом индекса с ошибкойValueError: cannot set a row with mismatched columns
(см. Stackoverflow.com/questions/47340571/… )df.loc[-1] = [2, 3, 4] # adding a row
, это немного вводит в заблуждение, так как-1
это не последняя строка / элемент, как для массивов Python.Не знаю, как вы звонили,
concat()
но он должен работать, если оба объекта одного типа. Может быть, проблема в том, что вам нужно передать второй вектор в фрейм данных? Используя df, который вы определили, для меня работает следующее:источник
Один из способов добиться этого -
Как правило, проще всего добавлять фреймы данных, а не серии. В вашем случае, поскольку вы хотите, чтобы новая строка была «наверху» (с начальным идентификатором), а функции нет
pd.prepend()
, я сначала создаю новый фрейм данных, а затем добавляю ваш старый.ignore_index
будет игнорировать старый текущий индекс в вашем фрейме данных и гарантировать, что первая строка действительно начинается с индекса,1
а не перезапускается с индекса0
.Типичный отказ от ответственности: Cetero censeo ... добавление строк - довольно неэффективная операция. Если вы заботитесь о производительности и можете каким-то образом обеспечить сначала создание фрейма данных с правильным (более длинным) индексом, а затем просто вставку дополнительной строки в фрейм данных, вы обязательно должны это сделать. Видеть:
Пока что у нас есть то, что у вас было
df
:Но теперь вы можете легко вставить строку следующим образом. Поскольку пространство было выделено заранее, это более эффективно.
источник
Я собрал короткую функцию, которая дает немного больше гибкости при вставке строки:
который может быть сокращен до:
Тогда вы можете использовать что-то вроде:
где
2
- позиция индекса, в которуюdf
вы хотите вставитьdf_new
.источник
Мы можем использовать
numpy.insert
. Это дает преимущество гибкости. Вам нужно только указать индекс, в который вы хотите вставить.В
np.insert(df.values, 0, values=[2, 3, 4], axis=0)
самом деле, 0 указывает функции место / индекс, в котором вы хотите разместить новые значения.источник
это может показаться слишком простым, но невероятно, что простая функция вставки новой строки не встроена. Я много читал о добавлении нового df к оригиналу, но мне интересно, будет ли это быстрее.
источник
Ниже будет лучший способ вставить строку в фрейм данных pandas без сортировки и сброса индекса:
источник
Добавить строку в панд довольно просто
DataFrame
:Создайте обычный словарь Python с теми же именами столбцов, что и ваш
Dataframe
;Используйте
pandas.append()
метод и передайте имя своего словаря, где.append()
- метод экземпляров DataFrame;Добавьте
ignore_index=True
сразу после названия словаря.источник
concat()
кажется немного быстрее, чем вставка и переиндексация последней строки. На случай, если кто-то поинтересовался скоростью двух топовых подходов:17,1 с ± 705 мс на цикл (среднее ± стандартное отклонение из 7 прогонов, по 1 циклу в каждом)
6,53 с ± 127 мс на цикл (среднее ± стандартное отклонение из 7 прогонов, по 1 циклу)
источник
Вы можете просто добавить строку в конец DataFrame, а затем настроить индекс.
Например:
Или используйте
concat
как:источник
Самый простой способ добавить строку во фрейм данных pandas:
Пример :
NB: длина вашего списка должна соответствовать длине фрейма данных.
источник