Разделить строку на множество столбцов со значением в одной строке Python

Начиная со столбца «код», мне нужно (по коду Python) повернуть столбцы с именем каждой строки, содержащей связанный номер (см. Пример ниже)

идентификатор код С HD ХТ С 1 74C + 24HD 74 24 0 0 2 23С + 14НТ + 3С 23 0 14 3 3 0 0 0 0 0

Спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Мы могли бы использовать str.extract здесь вместе с np.where:

df["C"] = np.where(~df["code"].str.extract(r'\b(\d+)C\b').isnull(), df["code"].str.extract(r'\b(\d+)C\b').astype(int), 0)
df["HD"] = np.where(~df["code"].str.extract(r'\b(\d+)HD\b').isnull(), df["code"].str.extract(r'\b(\d+)HD\b').astype(int), 0)
df["HT"] = np.where(~df["code"].str.extract(r'\b(\d+)HT\b').isnull(), df["code"].str.extract(r'\b(\d+)HT\b').astype(int), 0)
df["S"] = np.where(~df["code"].str.extract(r'\b(\d+)S\b').isnull(), df["code"].str.extract(r'\b(\d+)S\b').astype(int), 0)

Это решение может быть слишком жестким. Я не знаю, прибудет ли завтра другой код (пример 4PH), который не будет управляться.

Jresearcher 08.06.2023 12:04

Если количество выходных столбцов может быть переменным, то для извлечения потребуется динамический скрипт гораздо большего размера.

Tim Biegeleisen 08.06.2023 12:05

Можете ли вы помочь мне в этом?

Jresearcher 08.06.2023 12:16

Я новичок в Pandas, и приведенный выше ответ — лучшее, что я могу сделать.

Tim Biegeleisen 08.06.2023 12:22
Ответ принят как подходящий

Я предполагаю, что ваш первоначальный фрейм данных df выглядит как

   id             code
0   1       74C + 24HD
1   2  23C + 14HT + 3S
2   3                0
3   4    0.40C + 32.3P

Если это так, вы можете попробовать использовать .str.extractall в сочетании с .pivot: используйте шаблон, который соответствует комбинациям число-название-столбца и группирует обе части. .extractall затем извлекает части в отдельные столбцы. Столбец, который содержит часть имени столбца, затем можно разделить на столбцы с помощью .pivot.

new_cols_df = (
    df["code"].str.extractall(r"(\d+(?:\.\d*)?)(?P<column>[A-Z]+)").droplevel(1)
    .pivot(columns = "column")
    .droplevel(0, axis=1).rename_axis(None, axis=1)
)
df = pd.concat([df, new_cols_df], axis=1).fillna(0)

получить

   id             code     C  HD  HT     P  S
0   1       74C + 24HD    74  24   0     0  0
1   2  23C + 14HT + 3S    23   0  14     0  3
2   3                0     0   0   0     0  0
3   4    0.40C + 32.3P  0.40   0   0  32.3  0

Если вам нужны числовые значения в новых столбцах:

df[df.columns[2:]] = df[df.columns[2:]].astype("float")

Этот код возвращает ValueError: «Индекс содержит повторяющиеся записи, не может быть изменен». Что я делаю не так?

Jresearcher 08.06.2023 13:57

@Jresearcher Похоже, индекс df имеет дубликаты? Я добавил 2 строки, которые могут помочь с этим.

Timus 08.06.2023 14:06

@Jresearcher Дополнительный вопрос: является ли id индексом df, а не столбцом?

Timus 08.06.2023 14:11

мой df не имеет дубликатов в индексе. Однако даже с помощью reset_index это не работает, выдает ту же ошибку. Id не является индексом моего df. У меня есть индекс Python, а также идентификатор столбца. Каждая строка для меня независимая сущность.

Jresearcher 08.06.2023 14:15

@Jresearcher Хорошо, тогда я подозреваю, что code может иметь элементы, которые содержат столбцы несколько раз, например, например. 23C + 14HT + 3C (здесь дважды присутствует C): Возможно ли это?

Timus 08.06.2023 14:18

Я проверил свой набор данных, и да, возможно, что-то не так. Пример: у меня может быть 3C + 4CP + 5P (C находится в C e CP, но это не одно и то же).

Jresearcher 08.06.2023 14:25

@Jresearcher Хм, это ничего не должно сломать? (Я пробовал это в образце.)

Timus 08.06.2023 14:31

Я не могу понять, почему это происходит. Пытаюсь найти ошибки в данных. Когда вы говорите «# Если в индексе есть дубликаты», вы имеете в виду индекс или идентификатор Python?

Jresearcher 08.06.2023 14:47

@Jresearcher, я имею в виду df.index.

Timus 08.06.2023 14:52

ХОРОШО! Понял. У меня есть такие вещи, как «72C + 12C[p]». Кажется, это вызывает проблемы. Я заменил C[p] на CP и теперь вроде работает!!! Огромное спасибо!

Jresearcher 08.06.2023 14:52

Просто еще один вопрос. Если я должен управлять и включать десятичные дроби, как я могу это сделать? Бывший. 0,40С + 32,3Р

Jresearcher 08.06.2023 16:04

@Jresearcher Я обновил ответ, чтобы охватить и это. Но имейте в виду, что это может работать неправильно, если числа с плавающей запятой имеют другой формат.

Timus 08.06.2023 16:17

На самом деле это не работает. Я не знаю почему, но это расширяет значение в других столбцах.

Jresearcher 08.06.2023 16:23

@Jresearcher Может ли быть формат, отличный от примера в ответе, например. может ли поплавок выглядеть как .5P, т.е. без ведущего числа перед запятой?

Timus 08.06.2023 16:28

Нет, у меня не было подобного случая. Теперь это работает, может быть :)

Jresearcher 08.06.2023 17:45

Другие вопросы по теме