Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
311 / 271 / 118
Регистрация: 05.06.2013
Сообщений: 868

Pandas, дублирование/удаление случайных строк по правилам

23.03.2022, 14:12. Показов 3549. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, есть некоторые данные, допустим они выглядят так:
есть 3 юзера, у каждого из них есть 2 типа, у каждого типа 10 каких-то значений, на выходе 60 строк.
Python
1
2
3
4
5
6
7
8
9
10
11
import random
import pandas as pd
 
data = []
for v1 in range(3):
    for v2 in range(2):
        for v3 in range(10):
            data.append([f'user_{v1}', f'type_{v2}', random.randrange(0, 50)])
 
data_df = pd.DataFrame(data, columns=['user_name', 'user_type', 'user_value'])
data_df
есть ещё некоторые правила, допустим они генерируются так:
для каждого юзера и его типа указано некоторое целое число от -5 до 10
Python
1
2
3
4
5
6
7
changes = []
for v1 in range(3):
    for v2 in range(2):
        changes.append([f'user_{v1}', f'type_{v2}', random.randrange(-5, 10)])
 
changes_df = pd.DataFrame(changes, columns=['user_name', 'user_type', 'change'])
changes_df
Задача:
Если число в правилах положительное необходимо размножить N случайных строк для этого пользователя и типа.
(пример: есть 10 строк для пользователя user_0 и типа type_0, в правилах пришло число 3, необходимо случайным образом выбрать 3 строки из 10 и сделать из их дубликаты в этом же датафрейме, что бы было 13 строк для пользователя user_0 и типа type_0, 3 из них будут повторятся)

Если число в правилах отрицательное необходимо удалить N случайных строк для этого пользователя и типа.
(пример: есть 10 строк для пользователя user_0 и типа type_0, в правилах пришло число -4, необходимо случайным образом выбрать 4 строки из 10 и удалить их в этом же датафрейме, что бы было 6 строк для пользователя user_0 и типа type_0)

Пробую делать так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
temp = data_df.copy()
for index, row in changes_df.iterrows():
    user_name = row['user_name']
    user_type = row['user_type']
    change = int(row['change'])
    condition = (temp['user_name'] == user_name) & (temp['user_type'] == user_type)
 
    if change > 0:
        for n in range(change):
            temp = pd.concat([temp, temp[condition].sample(1)])
    elif change < 0:
        for n in range(abs(change)):
            temp.drop(temp[condition].index[random.randrange(len(temp[condition]))], inplace = True)
temp

Удаление вроде как работает, разве что выдаётся варнинг:
UserWarning: Boolean Series key will be reindexed to match DataFrame index.

А вот на добавлении падает уже другая ошибка и строки дублироваться отказываются:
ValueError: cannot reindex from a duplicate axis


Что я делаю не так и как это должно выглядеть, что бы строки правильно выбрасывались(без варнингов) и добавлялись?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2022, 14:12
Ответы с готовыми решениями:

Удаление строк по условию в DataFrame (Pandas)
Никак не получается удалить всю строку по условию df.drop(df.iloc.apply(lambda x: float(x)) &lt; lower_limit_ot) Выдает ошибку ...

Дублирование строк в DataFrame pandas
Добрый день! Имеется ли простой способ продублировать строку DataFrame 5 раз подряд и это повторить для каждой строки исходного...

Пример на текстовый файл - удаление (дублирование строк)
Нельзя использовать массивы содержащие все элементы исходного файла. Дан текстовый файл. В зависимости от выбора пользователя...

2
Эксперт Python
8849 / 4501 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
24.03.2022, 14:07
Лучший ответ Сообщение было отмечено Jefe как решение

Решение

Jefe,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import random
import pandas as pd
 
data = []
for v1 in range(3):
    for v2 in range(2):
        for v3 in range(10):
            data.append([f'user_{v1}', f'type_{v2}', random.randrange(0, 50)])
 
data_df = pd.DataFrame(data, columns=['user_name', 'user_type', 'user_value'])
print(data_df)
 
changes = []
for v1 in range(3):
    for v2 in range(2):
        changes.append([f'user_{v1}', f'type_{v2}', random.randrange(-5, 10)])
 
changes_df = pd.DataFrame(changes, columns=['user_name', 'user_type', 'change'])
print(changes_df)
 
 
##################################################
data_df['id'] = data_df[['user_name', 'user_type']].apply(lambda x: x[0] + '_' + x[1], axis=1)
changes_df['id'] = changes_df[['user_name', 'user_type']].apply(lambda x: x[0] + '_' + x[1], axis=1)
 
for i in range(len(changes_df)):
    id = changes_df.loc[i, 'id']
    cnt = changes_df.loc[i, 'change']
    if cnt < 0:
        data_df[data_df.id==id] = data_df[data_df.id==id].drop(data_df[data_df.id==id].sample(abs(cnt)).index)
    elif cnt > 0:
        data_df = pd.concat([data_df, data_df[data_df.id==id].sample(cnt)], axis=0)
 
data_df = data_df[~data_df.id.isna()].sort_values(by='id').drop('id',axis=1)
with pd.option_context('display.max_rows', None, 'display.max_columns', None):
    print(data_df)
##################################################
1
311 / 271 / 118
Регистрация: 05.06.2013
Сообщений: 868
24.03.2022, 14:38  [ТС]
Gdez, спасибо, разобрал твой код и понял ключевые моменты, где я пандасом неправильно пользовался
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.03.2022, 14:38
Помогаю со студенческими работами здесь

Разделить фрейм Pandas на две случайных выборки
Добрый день! Нужно разделить фрейм на две случайных выборки A и B. Пока делаю так. Наверняка есть способ эффективнее. Подскажите кто...

Расстановка случайных чисел в массиве 9х9, по правилам судоку
Всем привет. 1) Помогите написать макрос: расстановка случайных чисел в массиве 9х9, по правилам судоку(одна и та же цифра может...

Удаление дубликтов Pandas
Доброго дня! Имею датафрэйм типа: А|B 0|1 0|2 1|3 Мне требуется удалить дубликаты из столбца А таким образом, что бы общий...

Удаление выбросов DataFrame (Pandas)
Требуется удалить выбросы из показателя, как это сделать я не знаю, поэтому пишу сюда..

Удаление выбросов из Series pandas
Добрый день! Подскажите пожалуйста, есть вот такая функция: def outliers(row): q_1 = np.quantile(row, 0.25) q_3 =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru