дублирование строк в датасете

Рейтинг: 1Ответов: 2Опубликовано: 29.06.2023

Есть датасет продаж ПК со столбцами "цена", "наименование", "объем ПЗУ", "продажи". В столбце "продажи" указано количество проданных ПК. Чтобы в дальнейшем правильно посчитать статистику, нужно учесть количество продаж. Как дублировать строки в датасет по количеству продаж?

таблица

цена наименование объем ПЗУ продажи
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

Используйте 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['продажи']))
▲ 0

Вот вариант, который решит вашу проблему, но прошу учесть, что скорость работы у него будет не очень большая и может потребоваться время, если у вас большой датафрейм:

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 будут продублированы все строчки в зависимости от значения продаж в оригинальном датафрейме.