Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
28 / 3 / 1
Регистрация: 25.05.2022
Сообщений: 33

Разнести значения из одного столбца по остальным в зависимости от значения

01.11.2024, 12:20. Показов 2106. Ответов 36

Студворк — интернет-сервис помощи студентам
Добрый день.

Создал такой датафрейм
Python
1
2
df = pd.DataFrame({'ERR': [0,1,2,3,4], 'E0': [0,0,0,0,0], 'E1': [0,0,0,0,0], 'E2': [0,0,0,0,0],'E3': [0,0,0,0,0],'E4': [0,0,0,0,0]})
df
Надо в зависимости от числа в столбце ERR записать единицу в столбец, имя которого "Eчисло_из_столбцаERR".
Написал функцию
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def rasklad(Cod_err):
  if Cod_err == 0:
    return('E0')
  elif Cod_err == 1:
    return('E1')
  elif Cod_err == 2:
    return('E2')
  elif Cod_err == 3:
    return('E3')
  elif Cod_err == 4:
    return('E4')
  else:
    pass
Хотел использовать затем
Python
1
2
stolbec = df['ERR'].apply(lambda x: Cod_err(x))
df[stolbec] = 1
но имя столбца же не может быть переменной, то есть нет такой конструкции

В общем, задачка вроде простая, но прошу подсказки.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.11.2024, 12:20
Ответы с готовыми решениями:

Изменить значения одного столбца в зависимости от значений другого
Здравствуйте. Сегодня я впервые открыл Access, по этому прошу не кидаться в меня камнями. В общем, я создал БД, есть список цен на товар и...

Подстановка одного значения из двух таблиц в зависимости от значения в третьей таблице
Есть таблица 1 и таблица 2, в них есть поле "Мессенджер" Есть таблица 3, в которой есть поле ''Группа' Необходимо в отчет...

Вычисление значения функции в зависимости от одного заданного пользователем значения аргумента
Разработайте консольное приложение для вычисления значения функции в зависимости от одного заданного пользователем значения аргумента ....

36
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
02.11.2024, 17:42
Студворк — интернет-сервис помощи студентам
M_a_e_s_t_r_o, +1 в формуле - количество неучитываемых столбцов
Для Вашего примера +6
А так - при работе с пандас критически важны реальные данные…
1
28 / 3 / 1
Регистрация: 25.05.2022
Сообщений: 33
05.11.2024, 14:54  [ТС]
Уважаемый volkomorov, прошу ещё раз помочь.

Немного изменилась задача - надо ячейки заполнять не единицей, а значением. Собственно, как сначала озаглавил шапку темы.
я понимаю, что в коде
Python
1
2
for c in df.columns.values[1:]:
    df.loc[df['ERR'] == int(c[1:]) , c] = 1
надо единичку в конце второй строки заменить на df[''], не не понимаю, на что.
0
150 / 120 / 36
Регистрация: 01.11.2019
Сообщений: 425
05.11.2024, 15:03
А каким значением надо заменить?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
05.11.2024, 15:35
M_a_e_s_t_r_o, В пандасе есть оказывается метод get_dummies:
Python
1
res = pd.get_dummies(df['ERR']).astype(int)
Получается тот же результат.
https://pandas.pydata.org/docs... mmies.html
А заменить 1 на значения можно, просто перемножив матрицу на вектор-столбец (вектор-строку) или просто число
0
28 / 3 / 1
Регистрация: 25.05.2022
Сообщений: 33
05.11.2024, 15:48  [ТС]
volkomorov,
В датафрейме есть столбец 'SUMM', значением из этой ячейки надо заполнить.
(Перечитал свой вопрос - да, действительно, можно понять, что заполнить какой-то константой)

Добавлено через 11 минут
Цитата Сообщение от Gdez Посмотреть сообщение
M_a_e_s_t_r_o, В пандасе есть оказывается метод get_dummies:
Python
1
res = pd.get_dummies(df['ERR']).astype(int)
Получается тот же результат.
https://pandas.pydata.org/docs... mmies.html
А заменить 1 на значения можно, просто перемножив матрицу на вектор-столбец (вектор-строку) или просто число

Gdez
, спасибо конечно, но я этого просто не понимаю. Я привык мыслить 30 лет назад перебором таблицы вложенными циклами с сортировкой и подсуммировкой по условию и занесением результата в массив (n-мерный, если нужны итоги по месяцам, отделам и т.д.) - так можно было сделать любой отчёт и сформировать любые данные. Можно, наверное, и в Python такое написать, а смысл тогда писать на Python? Дилемма.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
05.11.2024, 15:51
M_a_e_s_t_r_o, Хорошо
Если что, вдруг пригодится - старая методичка по пандасу:
Вложения
Тип файла: pdf ama2015_pandas.pdf (955.9 Кб, 6 просмотров)
0
150 / 120 / 36
Регистрация: 01.11.2019
Сообщений: 425
05.11.2024, 16:35
просто 1 заменить df['SUM']
0
28 / 3 / 1
Регистрация: 25.05.2022
Сообщений: 33
05.11.2024, 21:16  [ТС]
просто 1 заменить df['SUM'] - это была первая мысль.
Сделал - не работает, зависло.
Потом дошло, что раз добавились столбы,то columns = df_SBP.columns.values не будет верно.
Сделал columns = ['ERR', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9', 'E10', 'E11', 'E12', 'E0'].
Получилось, спасибо.
0
28 / 3 / 1
Регистрация: 25.05.2022
Сообщений: 33
06.11.2024, 16:15  [ТС]
volkomorov,

а можно ещё ровно полстрочки кода?

мне нужно подсчитать не только сумму ошибочных платежей по дням, но и количество. Родилась такая строка кода:
Python
1
df_SBP_IT = df_SBP.groupby('WTIME', as_index=False).agg({'SUMM': ['sum','count'], 'E1': ['sum','count'], 'E2': ['sum','count'], 'E3': ['sum','count'], 'E4': ['sum','count'], 'E5': ['sum','count'], 'E6': ['sum','count'], 'E7': ['sum','count'], 'E9': ['sum','count'], 'E10': ['sum','count'], 'E11': ['sum','count'], 'E12': ['sum','count'], 'E0': ['sum','count']})
И если параметр 'sum' работает корректно, потому что плюсование ноля ничего не меняет, то 'count' считает общее количество платежей, в том числе и нулевым значением.
Решил разделить 'sum' и 'count', добавив в датафрейм столбцы.
Python
1
df_SBP[['C1','C2','C3','C4','C5','C6','C7','C8','C9','C10','C11','C12','C0']] = 0
Теперь надо в Ваш добавить строку, заносящую в "Це-шки" единицу (в "Е-шках" сумма).
Python
1
2
3
4
5
6
7
columns = ['ERR', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9', 'E10', 'E11', 'E12', 'E0']
columns_С = ['C1','C2','C3','C4','C5','C6','C7','C8','C9','C10','C11','C12','C0']
for c in columns[1:]:
  # Проставим сумму единицу по видам ошибок
  df_SBP.loc[                                        ] = 1
  # Проставим сумму платежа по видам ошибок
  df_SBP.loc[df_SBP['ERR'].astype('str') == c[1:] , c] = df_SBP['SUMM']
Но я не понимаю, как обратиться в данном случае к соответствующей ячейке (столбцу? строке?). Документацию, по свойству .loc читал, примеры смотрел.
Имя датафрейма реальное, оставил как есть.

Добавлено через 7 минут
Gdez, Вашу методичку смотрел внимательно, там .loc упоминается 2 раза

Индексация
Python
1
data.loc['2000-01':'2000-02',['D','B','A']] # по названию
и
Группировка
Python
1
print d.loc[d.groupby('A')['B'].idxmin()]
к сожалению, без объяснения.
0
150 / 120 / 36
Регистрация: 01.11.2019
Сообщений: 425
06.11.2024, 18:32
Python
1
2
3
4
5
6
7
columns_e = ['E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9', 'E10', 'E11', 'E12', 'E0']
columns_c = ['C1','C2','C3','C4','C5','C6','C7','C8','C9','C10','C11','C12','C0']
for e, c in zip(columns_e, columns_c):
  # Проставим сумму единицу по видам ошибок
  df_SBP.loc[df_SBP['ERR'] == int(c[1:]) , c] = 1
  # Проставим сумму платежа по видам ошибок
  df_SBP.loc[df_SBP['ERR'] == int(e[1:]) , e] = df_SBP['SUMM']
Добавлено через 25 минут
еще вариант

Python
1
2
3
columns = ['ERR', 'E1', 'E2', 'E3', 'E4', 'E5', 'E6', 'E7', 'E8', 'E9', 'E10', 'E11', 'E12', 'E0']
for c in columns[1:]:
    df_SBP.loc[df_SBP['ERR'] == int(c[1:]) , [c, "c"+c[1:]]] = df_SBP['SUMM'], 1
0
28 / 3 / 1
Регистрация: 25.05.2022
Сообщений: 33
06.11.2024, 20:40  [ТС]
volkomorov, да, работает. Второй вариант не проверял.

Собственно, задача стара как мир - есть таблица платежей (дата, сумма платежа, код ошибки (семантика нуля - "без ошибки")). Надо сгруппировать (раньше говорили "подсуммировать") по вертикали дням и разложить по горизонтали итоги по дням по кодам ошибок (сумма платежей, кол-во платежей).
С формированием этой таблицы из исходной я справился (включая кодирование ошибок, в оригинале - текст, ну и по виду платежа надо было отобрать, и регуляркой типовые ошибки из текстовых сформировать). Но на финише встал, так что спасибо за уделённое время.

Возможно, даже итоговую строку кода можно сделать изящнее, чем у меня:
Python
1
df_SBP_IT = df_SBP.groupby('WTIME', as_index=False).agg({'SUMM': ['sum','count'],'E1': ['sum'],'C1': ['sum'],'E2': ['sum'],'C2': ['sum'],'E3': ['sum'],'C3': ['sum'],'E4': ['sum'],'C4': ['sum'],'E5': ['sum'],'C5': ['sum'],'E6': ['sum'],'C6': ['sum'],'E7': ['sum'],'C7': ['sum'],'E8': ['sum'],'C8': ['sum'],'E9': ['sum'],'C9': ['sum'],'E10': ['sum'],'C10': ['sum'],'E11': ['sum'],'C11': ['sum'],'E0': ['sum'],'C0': ['sum']})
0
150 / 120 / 36
Регистрация: 01.11.2019
Сообщений: 425
06.11.2024, 22:10
Можно использовать сводную таблицу

Python
1
2
3
4
5
6
7
8
9
10
for e, c in zip(columns_e, columns_c):
  # Проставим сумму единицу по видам ошибок
  #df_SBP.loc[df_SBP['ERR'] == int(c[1:]) , c] = 1
  # Проставим сумму платежа по видам ошибок
  df_SBP.loc[df_SBP['ERR'] == int(e[1:]) , e] = df_SBP['SUMM']
 
 
print(df_SBP)
pivot = pd.pivot_table(df_SBP, index="DATA", aggfunc={'sum', lambda x: np.count_nonzero(x)})
print(pivot)
0
28 / 3 / 1
Регистрация: 25.05.2022
Сообщений: 33
07.11.2024, 11:18  [ТС]
volkomorov, спасибо.

Только у меня при формировании pivot
KeyError: 'DATA'
0
150 / 120 / 36
Регистрация: 01.11.2019
Сообщений: 425
07.11.2024, 11:21
Это пример, в вашем случае надо заменить

Python
1
index=''DATA''
на
Python
1
index=''WTIME''
0
28 / 3 / 1
Регистрация: 25.05.2022
Сообщений: 33
07.11.2024, 11:39  [ТС]
volkomorov,
Да, так работает, но выполняется для всех столбцов, то есть результат выглядит крайне непрезентабельно.
Наудачу попробовал
Python
1
pivot = pd.pivot_table(df_SBP['E1', 'E2'], index="WTIME", aggfunc={'sum', lambda x: np.count_nonzero(x)})
KeyError: ('E1', 'E2')
То есть aggfunc должна выполняться для некоторых столбцов, не всех.
Ну ладно, главное есть конечный результат.
0
150 / 120 / 36
Регистрация: 01.11.2019
Сообщений: 425
07.11.2024, 12:06
Можно добавить value и указать там нужные столбцы. Более подробная информация по pivot_table есть в документации по pandas.
0
28 / 3 / 1
Регистрация: 25.05.2022
Сообщений: 33
07.11.2024, 14:43  [ТС]
volkomorov, да, оказалось несложно
Python
1
pivot = pd.pivot_table(df_SBP, values=['E1','E2','E3','E4','E5','E6','E7','E8','E9','E10','E11','E12','E0'], index="WTIME", aggfunc={'sum', lambda x: np.count_nonzero(x)})
Только сортировка столбцов в итоговой таблице получается, наверное, символьная (строковая) -
E0 E1 E10 E11 E12 E2 E3 E4 E5 E6 E7 E8 E9
и заказчик хочет сначала столбец с суммой, а потом с количеством.
Но это и в экселе переставить можно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.11.2024, 14:43

Построение графика зависимости одного значения от другого, для примера есть график и значения
Не понимаю как построить график зависимости одного значения от другого, для примера есть график и значения, x=0.30 Egx2=1.798, как мне...

Замена одного значения другим, в зависимости от этого значения
Добрый день) У меня есть список с текстовыми значениями val-x, и есть другой список в 2 столбца...val1 и val2 Мне нужно сделать так,...

Разнести отрицательные, положительные значения и значения из диапазона по разным файлам
С# Записать 1000 случайных чисел в диапазоне в файл a.txt. В файл otr.txt вывести отрицательные значения, ...

Как из одного столбца вывести значения в два столбца
Не могу никак разобраться, помогите пожалуйста.. Есть две таблицы: Team(id, name, captain, country) и Score(team_id, date, score),...

Выбрать значения из одного столбца в два столбца
Добрый день! есть таблица с id городов с офисами mysql> select * from citylist ; +---------+-----------------+ | cityId |...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru