Сложное отделение от столбца в Python

У меня есть фрейм данных, df, где я хотел бы, чтобы определенные разделения значений в моем столбце отображали проценты. Мне нужно первое «слово», разделенное знаком «-» и его значением #T. бывший. (12T) По сути, я бы сгруппировал Type, если совпадает первое слово, а также его #T (например, 12T, 50T и т. д.). Некоторые значения #T выглядят так: 6.4T , а некоторые из «первых» слова выглядят так: AY14.5

ОБНОВЛЕНО

There are        2  unique counts    of   Hello-HEL-HE-A6123-123A-12T
                 2  unique counts    of   Hello-HEL-HE-A6123-123A-50T
                 1  unique count(s)  of   Happy-HAP-HA-R650-570A-90T
                 2  unique counts    of   Kind-KIN-KI-T490-NET_14T-A.0
                 2  unique counts    of   AY14.5-fyy-FY-R770-256G-6.4T-R1-v.A

Данные:

Type

Hello-HEL-HE-A6123-123A-12T_TYPE-v.A    
Hello-HEL-HE-A6123-123A-12T_TYPE-v.E    
Hello-HEL-HE-A6123-123A-50T_TYPE-v.C    
Hello-HEL-HE-A6123-123A-50T_TYPE-v.A    
Happy-HAP-HA-R650-570A-90T_version-v.A  
Kind-KIN-KI-T490-NET_14T-A.0
Kind-KIN-KI-T490-NET_14T-A.0       
AY14.5-fyy-FY-R770-256G-6.4T-R1-v.A
AY14.5-fyy-FY-R770-256G-6.4T-R1-v.A

Желанный:

Type                                    Percent

Hello    12T                        22.2%
Hello    50T                        22.2%
Happy    90T                        11.1%
Kind     14T                        22.2%
AY14.5   6.4T                       22.2%                 

Делает:

df=df.assign(Type=df.Type.str.split('_').str[0]) df2= 
(df['Type'].value_counts(normalize=True)*100).to_frame('%') 
print(df2.rename_axis(index='Type'))

Однако мой вывод показывает полный тип (имя) и исключает случаи, когда появляется «_» перед #T (например, 12T)

Type     
                         
Hello-HEL-HE-A6123-123A-12T 

Любое предложение приветствуется, я все еще устраняю неполадки.

ОБНОВЛЕНО

Желанный:

Type                                    Percent

Hello    12T                        22.2%
Hello    50T                        22.2%
Happy    90T                        11.1%
Kind     14T                        22.2%
AY14.5   6.4T                       22.2%        

Я бы посоветовал вам создать новый столбец, используя регулярное выражение для XXT (XX — целое число), чтобы сохранить различные выходные данные и сгруппировать его, чтобы получить проценты.

IoaTzimas 18.12.2020 19:58

ок @IoaTzimas попробую, спасибо

Lynn 18.12.2020 19:59
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

import pandas as pd
df = pd.DataFrame({'Type': {0: 'Hello-HEL-HE-A6123-123A-12T_TYPE-v.A',
  1: 'Hello-HEL-HE-A6123-123A-12T_TYPE-v.E',
  2: 'Hello-HEL-HE-A6123-123A-50T_TYPE-v.C',
  3: 'Hello-HEL-HE-A6123-123A-50T_TYPE-v.A',
  4: 'Happy-HAP-HA-R650-570A-90T_version-v.A',
  5: 'Kind-KIN-KI-T490-NET_14T-A.0',
  6: 'Kind-KIN-KI-T490-NET_14T-A.0'}})  

df.Type = df.Type.str.split('-').str[0] + ' ' + df.Type.str.extract('(\d+T)')
(df.groupby('Type').size() / len(df) * 100).to_frame('Percent').reset_index()

Выход

        Type    Percent
0   Hello 12T   28.571429
1   Hello 14T   28.571429
2   Hello 50T   28.571429
3   Hello 90T   14.285714

Спасибо - по какой-то причине многие мои данные не отображаются - позвольте мне перепроверить (это работает для некоторых, не для всех)

Lynn 18.12.2020 20:09
Ответ принят как подходящий
import pandas as pd

def extract_value(s):
    regex = re.search(r'(^.+?)-.+?(\d+(?:\.\d+)?T)', s)
    if regex:
        first_word = regex.group(1)
        code = regex.group(2)
        return f'{first_word} {code}'
    return s

df = pd.DataFrame([['Hello-HEL-HE-A6123-123A-12T_TYPE-v.A'],
                   ['Hello-HEL-HE-A6123-123A-12T_TYPE-v.E'],
                   ['Hello-HEL-HE-A6123-123A-50T_TYPE-v.C'],
                   ['Hello-HEL-HE-A6123-123A-50T_TYPE-v.A'],
                   ['Happy-HAP-HA-R650-570A-90T_version-v.A'],
                   ['Kind-KIN-KI-T490-NET_14T-A.0'],
                   ['Kind-KIN-KI-T490-NET_14T-A.0'],
                   ['AY14.5-fyy-FY-R770-256G-6.4T-R1-v.A'],
                   ['AY14.5-fyy-FY-R770-256G-6.4T-R1-v.A']])

df.columns = ['Type']
df['Type'] = df['Type'].apply(lambda x: extract_value(x))
df2 = (df['Type'].value_counts(normalize=True)*100).to_frame('%')
print(df2.rename_axis(index='Type').reset_index())

Выход:

          Type          %
0  AY14.5 6.4T  22.222222
1     Kind 14T  22.222222
2    Hello 50T  22.222222
3    Hello 12T  22.222222
4    Happy 90T  11.111111

Привет, @David, это дает мне: ValueError: несоответствие длины: ожидаемая ось имеет 8 элементов, новые значения имеют 1 элемент

Lynn 18.12.2020 20:14

Не могли бы вы опубликовать образец данных, который генерирует эту ошибку?

David M. 18.12.2020 20:18

Я обновил свой код и вывел соответственно.

David M. 18.12.2020 20:27

Хорошо, он говорит: AttributeError: объект «NoneType» не имеет атрибута «группа» - я посмотрю это

Lynn 18.12.2020 20:42

Это означает, что регулярное выражение не совпало. (По крайней мере) одна из ваших строк не соответствует шаблону, описанному до сих пор.

David M. 18.12.2020 20:44

Хорошо, есть ли способ переопределить это и просто продолжить?

Lynn 18.12.2020 20:45

Конечно. Я изменил код так, что строки, не соответствующие шаблону, будут игнорироваться. Неформально регулярное выражение ищет все символы до (но исключая) первого дефиса, а затем число (целое или десятичное), за которым следует T.

David M. 18.12.2020 20:50

Я вижу @David, что он делает с несовпадающими строками? отбросит ли их? если да, то есть ли способ показать те, которые «остались»?

Lynn 18.12.2020 21:11

хорошо, теперь он говорит: TypeError: ожидаемая строка или объект, подобный байтам - мне нужно преобразовать столбец типа в строку?

Lynn 18.12.2020 21:13

Вы имеете в виду показывать всю строку вместо первого слова только тогда, когда строка не соответствует шаблону?

David M. 18.12.2020 21:20

да - в основном мне интересно, не будут ли несопоставленные просто не отображаться - также для ошибки типа, должен ли я преобразовать столбец типа в строку?

Lynn 18.12.2020 21:21

Я изменил код, чтобы вернуть полную строку, если шаблон регулярного выражения не соответствует. Что касается ошибки, мне нужно увидеть строку, которая ее вызывает.

David M. 18.12.2020 21:25

хорошо, спасибо. Я думаю, что могу просто преобразовать в строку, верно? разве это не решит?

Lynn 18.12.2020 21:26

Немного сложно сказать, потому что я не знаю, откуда берется ошибка. Вывод, возвращаемый функцией extract_value() (будь то регулярное выражение или полная строка), всегда является строкой.

David M. 18.12.2020 22:39

Это работает - я устранил эту проблему и вижу, что в моем столбце должно быть NULL

Lynn 18.12.2020 22:51

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

Похожие вопросы