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






Мы могли бы использовать 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)
Если количество выходных столбцов может быть переменным, то для извлечения потребуется динамический скрипт гораздо большего размера.
Можете ли вы помочь мне в этом?
Я новичок в Pandas, и приведенный выше ответ — лучшее, что я могу сделать.
Я предполагаю, что ваш первоначальный фрейм данных 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 Похоже, индекс df имеет дубликаты? Я добавил 2 строки, которые могут помочь с этим.
@Jresearcher Дополнительный вопрос: является ли id индексом df, а не столбцом?
мой df не имеет дубликатов в индексе. Однако даже с помощью reset_index это не работает, выдает ту же ошибку. Id не является индексом моего df. У меня есть индекс Python, а также идентификатор столбца. Каждая строка для меня независимая сущность.
@Jresearcher Хорошо, тогда я подозреваю, что code может иметь элементы, которые содержат столбцы несколько раз, например, например. 23C + 14HT + 3C (здесь дважды присутствует C): Возможно ли это?
Я проверил свой набор данных, и да, возможно, что-то не так. Пример: у меня может быть 3C + 4CP + 5P (C находится в C e CP, но это не одно и то же).
@Jresearcher Хм, это ничего не должно сломать? (Я пробовал это в образце.)
Я не могу понять, почему это происходит. Пытаюсь найти ошибки в данных. Когда вы говорите «# Если в индексе есть дубликаты», вы имеете в виду индекс или идентификатор Python?
@Jresearcher, я имею в виду df.index.
ХОРОШО! Понял. У меня есть такие вещи, как «72C + 12C[p]». Кажется, это вызывает проблемы. Я заменил C[p] на CP и теперь вроде работает!!! Огромное спасибо!
Просто еще один вопрос. Если я должен управлять и включать десятичные дроби, как я могу это сделать? Бывший. 0,40С + 32,3Р
@Jresearcher Я обновил ответ, чтобы охватить и это. Но имейте в виду, что это может работать неправильно, если числа с плавающей запятой имеют другой формат.
На самом деле это не работает. Я не знаю почему, но это расширяет значение в других столбцах.
@Jresearcher Может ли быть формат, отличный от примера в ответе, например. может ли поплавок выглядеть как .5P, т.е. без ведущего числа перед запятой?
Нет, у меня не было подобного случая. Теперь это работает, может быть :)
Это решение может быть слишком жестким. Я не знаю, прибудет ли завтра другой код (пример 4PH), который не будет управляться.