Как, при добавлении новой строки, найти ее в базе
df = pd.DataFrame(
[
["Игра", "Отдел игр"],
["Папка", "-"],
["Игра", "Отдел игр"],
["Игра", "Отдел игр"],
["Папка", "Отдел канцелярии"],
["Батут", "Отдел спорттоваров"],
],
columns=["Товар", "Отдел"],
)
new_row = {"Товар": "Папка", "Отдел": "-"}
df = pd.concat([df, pd.DataFrame([new_row])], ignore_index=True)
df
Как при добавлении нового ТОВАРА, для которого ОТДЕЛ равен '-', найти ОТДЕЛ выше, если он прописан, и подставить его вместо '-'?
Как привести в порядок базу и заменить наименование ОТДЕЛА='-' на данные, найденные выше?
Как выполнить задачу оптимальнее, так как строк много, около 80 тысяч?
Ответы (1 шт):
Заменить прочерк в 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
Если заполнять сразу во всём датафрейме, это должно быть быстро.
А вообще не добавляйте строки по одной, сделайте готовый список/словарь из тех строк, которые вы хотите добавить, преобразуйте их в датасет и добавьте этот датасет к исходному за один раз. Модифицировать датасет по одной строчке - очень медленная операция.