дублирование строк в датасете
Есть датасет продаж ПК со столбцами "цена", "наименование", "объем ПЗУ", "продажи". В столбце "продажи" указано количество проданных ПК. Чтобы в дальнейшем правильно посчитать статистику, нужно учесть количество продаж. Как дублировать строки в датасет по количеству продаж?
таблица
| цена | наименование | объем ПЗУ | продажи |
|---|---|---|---|
| 10 | 1 | 100 | 1 |
| 111 | 2 | 80 | 2 |
| 121 | 3 | 90 | 5 |
| 22 | 4 | 100 | 10 |
должна стать
| цена121 | наименование3 | объем ПЗУ90 | продажи5 |
|---|---|---|---|
| 10 | 1 | 100 | 1 |
| 111 | 2 | 80 | 2 |
| 111 | 2 | 80 | 2 |
| 121 | 3 | 90 | 5 |
| 121 | 3 | 90 | 5 |
| 121 | 3 | 90 | 5 |
| 121 | 3 | 90 | 5 |
| 121 | 3 | 90 | 5 |
| 22 | 4 | 100 | 10 |
+еще 8 раз
| 22 | 4 | 100 | 10 |
|---|
Ответы (2 шт):
Вот вариант, который решит вашу проблему, но прошу учесть, что скорость работы у него будет не очень большая и может потребоваться время, если у вас большой датафрейм:
df = pd.DataFrame({
'цена': [10,111, 121, 22],
'наименование': [1, 2, 3, 4],
'обьем ПЗУ': [100, 80, 90, 100],
'продажи': [1, 2, 5, 10]
})
duplicated_df = pd.DataFrame()
for _, row in df.iterrows():
count = row['продажи']
duplicated_rows = pd.concat([row] * count, axis=1).T
duplicated_df = pd.concat([duplicated_df, duplicated_rows], ignore_index=True)
Теперь в duplicated_df будут продублированы все строчки в зависимости от значения продаж в оригинальном датафрейме.
Используйте pd.Series.repeat(), передав в качестве аргумента колонку с количеством, чтобы сгенерировать индексы согласно количеству (продаж), и передайте новый индекс в DataFrame.reindex() чтобы составить датафрейм с нужной индексацией и количеством повторов на каждый индекс.
df = df.reindex(df.index.repeat(df['продажи']))
Результат:
цена наименование объем ПЗУ продажи
0 10 1 100 1
1 111 2 80 2
1 111 2 80 2
2 121 3 90 5
2 121 3 90 5
2 121 3 90 5
2 121 3 90 5
2 121 3 90 5
3 22 4 100 10
3 22 4 100 10
3 22 4 100 10
… … … … …
… и так далее
Весь код:
import pandas as pd
data = {
'цена': [10, 111, 121, 22],
'наименование': [1, 2, 3, 4],
'объем ПЗУ': [100, 80, 90, 100],
'продажи': [1, 2, 5, 10]
}
df = pd.DataFrame(data)
df = df.reindex(df.index.repeat(df['продажи']))