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

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

01.11.2024, 12:20. Показов 1969. Ответов 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,319
02.11.2024, 17:42
M_a_e_s_t_r_o, +1 в формуле - количество неучитываемых столбцов
Для Вашего примера +6
А так - при работе с пандас критически важны реальные данные…
1
27 / 2 / 1
Регистрация: 25.05.2022
Сообщений: 24
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,319
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
27 / 2 / 1
Регистрация: 25.05.2022
Сообщений: 24
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,319
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
27 / 2 / 1
Регистрация: 25.05.2022
Сообщений: 24
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
27 / 2 / 1
Регистрация: 25.05.2022
Сообщений: 24
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
27 / 2 / 1
Регистрация: 25.05.2022
Сообщений: 24
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
27 / 2 / 1
Регистрация: 25.05.2022
Сообщений: 24
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
27 / 2 / 1
Регистрация: 25.05.2022
Сообщений: 24
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
27 / 2 / 1
Регистрация: 25.05.2022
Сообщений: 24
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
Ответ Создать тему
Новые блоги и статьи
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
22. Подключение слоя системной динамики (потоковые диффуры): экономические метрики модели
anaschu 17.06.2026
Апдейт модели: финансовый контур, разделение затрат Продолжаю развивать модель рабочего коллектива на AnyLogic. В этот раз работа шла над агентом Экономика — финансовым SD-слоем модели. Задача:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru