Добавить строку к pandas фрейму данных, используя pandas .concat () - PullRequest
0 голосов
/ 18 апреля 2020

Я хочу добавить строку в pandas фрейм данных без использования df.loc. Я ищу что-то похожее на метод .append(), используемый в списках.

Я делаю это в своей повседневной жизни, но я ищу что-то более удобное, чем мое текущее решение:

stupid_table = pd.DataFrame(columns=['max_depth', 'features'])
for max_depth in np.arange(50, 101):
    new_row = pd.DataFrame({'max_depth':[max_depth], 'features':[10]})
    stupid_table = pd.concat([stupid_table, new_row], axis=0)

Я бы хотел объявить new_row как список или серию pandas вместо фрейма данных pandas. Есть ли способ заставить следующий синтаксис работать?

stupid_table = pd.DataFrame(columns=['max_depth', 'features'])
for max_depth in np.arange(50, 101):
    new_row = [max_depth, 10]
    stupid_table = pd.concat([stupid_table, new_row], axis=0)

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

РЕДАКТИРОВАТЬ: Я предпочитаю не использовать .loc, потому что мой для l oop принимает каждое значение в массивах numpy , Переключив текущий синтаксис на for value in range(len(np.arange(start, stop))), чтобы заставить l oop использовать индексы, тогда мне придется переводить комбинации в числовые значения c, потому что в реальном примере у меня есть тонны комбинаций. Я бы предпочел не делать этого.

1 Ответ

0 голосов
/ 19 апреля 2020

Решение, максимально приближенное к вашему описанию:

import numpy as np
import pandas as pd

stupid_table = pd.DataFrame(columns=['max_depth', 'features'])
for max_depth in np.arange(50, 101):
    new_row = [max_depth, 10]
    new_df = pd.DataFrame({head: [val] for head, val in zip(stupid_table.columns, new_row)})
    stupid_table = pd.concat([stupid_table, new_df], axis=0)

Однако это неэффективно, поскольку основной объект данных stupid_table переназначается внутри вашего основного l oop. В идеале вы можете сохранить все новые фреймы данных, чтобы добавить их в новый список и в конце выполнить конкатенацию. Сюда не входит сброс индекса для вновь созданного информационного кадра, но это может быть хорошей идеей.

import numpy as np
import pandas as pd

stupid_table = pd.DataFrame(columns=['max_depth', 'features'])
data_frames = [stupid_table]
for max_depth in np.arange(50, 101):
    new_row = [max_depth, 10]
    data_frames.append(pd.DataFrame({head: [val] for head, val in zip(stupid_table.columns, new_row)}))
stupid_table = pd.concat(data_frames, axis=0)
...