У меня есть фрейм данных, 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%
ок @IoaTzimas попробую, спасибо
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
Спасибо - по какой-то причине многие мои данные не отображаются - позвольте мне перепроверить (это работает для некоторых, не для всех)
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 элемент
Не могли бы вы опубликовать образец данных, который генерирует эту ошибку?
Я обновил свой код и вывел соответственно.
Хорошо, он говорит: AttributeError: объект «NoneType» не имеет атрибута «группа» - я посмотрю это
Это означает, что регулярное выражение не совпало. (По крайней мере) одна из ваших строк не соответствует шаблону, описанному до сих пор.
Хорошо, есть ли способ переопределить это и просто продолжить?
Конечно. Я изменил код так, что строки, не соответствующие шаблону, будут игнорироваться. Неформально регулярное выражение ищет все символы до (но исключая) первого дефиса, а затем число (целое или десятичное), за которым следует T.
Я вижу @David, что он делает с несовпадающими строками? отбросит ли их? если да, то есть ли способ показать те, которые «остались»?
хорошо, теперь он говорит: TypeError: ожидаемая строка или объект, подобный байтам - мне нужно преобразовать столбец типа в строку?
Вы имеете в виду показывать всю строку вместо первого слова только тогда, когда строка не соответствует шаблону?
да - в основном мне интересно, не будут ли несопоставленные просто не отображаться - также для ошибки типа, должен ли я преобразовать столбец типа в строку?
Я изменил код, чтобы вернуть полную строку, если шаблон регулярного выражения не соответствует. Что касается ошибки, мне нужно увидеть строку, которая ее вызывает.
хорошо, спасибо. Я думаю, что могу просто преобразовать в строку, верно? разве это не решит?
Немного сложно сказать, потому что я не знаю, откуда берется ошибка. Вывод, возвращаемый функцией extract_value()
(будь то регулярное выражение или полная строка), всегда является строкой.
Это работает - я устранил эту проблему и вижу, что в моем столбце должно быть NULL
Я бы посоветовал вам создать новый столбец, используя регулярное выражение для XXT (XX — целое число), чтобы сохранить различные выходные данные и сгруппировать его, чтобы получить проценты.