Как, при добавлении новой строки, найти ее в базе

Рейтинг: -1Ответов: 1Опубликовано: 21.07.2025
df = pd.DataFrame(
    [
        ["Игра", "Отдел игр"],
        ["Папка", "-"],
        ["Игра", "Отдел игр"],
        ["Игра", "Отдел игр"],
        ["Папка", "Отдел канцелярии"],
        ["Батут", "Отдел спорттоваров"],
    ],
    columns=["Товар", "Отдел"],
)

new_row = {"Товар": "Папка", "Отдел": "-"}
df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True)
df
  1. Как при добавлении нового ТОВАРА, для которого ОТДЕЛ равен '-', найти ОТДЕЛ выше, если он прописан, и подставить его вместо '-'?

  2. Как привести в порядок базу и заменить наименование ОТДЕЛА='-' на данные, найденные выше?

  3. Как выполнить задачу оптимальнее, так как строк много, около 80 тысяч?

Ответы

▲ 2

Заменить прочерк в new_row (до добавления её в датафрейм):

mask = (df['Товар'] == new_row['Товар']) & (df['Отдел'] != '-')
new_row['Отдел'] = df.loc[mask, 'Отдел'].iloc[0]
new_row
# {'Товар': 'Папка', 'Отдел': 'Отдел канцелярии'}

Заполнить прочерки во всём датафрейме сразу:

dict_ = dict(df[df['Отдел'] != '-'].groupby('Товар').max().reset_index().values)
mask = df['Отдел'] == '-'
df.loc[mask, 'Отдел'] = df.loc[mask, 'Товар'].map(dict_).values
df

Если заполнять сразу во всём датафрейме, это должно быть быстро.

А вообще не добавляйте строки по одной, сделайте готовый список/словарь из тех строк, которые вы хотите добавить, преобразуйте их в датасет и добавьте этот датасет к исходному за один раз. Модифицировать датасет по одной строчке - очень медленная операция.