Как нарезать каждый отдельный элемент списка или массива Python

У меня есть список python, который получен из серии pandas следующим образом:

dsa = pd.Series(crew_data['Work Type'])
disc = [dsa]
print(disc)

Результат выглядит следующим образом:

[0      Disc - Standard Removal & Herbicide 
 1      Disc - Standard Removal & Herbicide  
 2                            Standard Trim  
 3                       Disc - Hazard Tree  
 4                       Disc - Hazard Tree  
                  ...                   
 134                     Disc - Hazard Tree  
 135                     Disc - Hazard Tree  
 136                     Disc - Hazard Tree  
 137                     Disc - Hazard Tree  
 138                     Disc - Hazard Tree  
 Name: Work Type, Length: 139, dtype: object]

Теперь следующий шаг — нарезать первые 4 символа каждого элемента так, чтобы возвращаемое значение было Disc.

Это кажется простым, когда выполняется для одной строки, однако при попытке сделать это со списком по какой-то причине кажется почти невозможным. Это можно сделать просто в Excel, используя формулу =LEFT(A1,4), так что, конечно, это можно сделать так же просто в python?

Если у кого-то есть решение, было бы здорово.


person jasw    schedule 29.01.2020    source источник
comment
Является ли этот список одной большой строкой или в списке есть несколько объектов? Не могли бы вы привести лучший пример?   -  person PacketLoss    schedule 29.01.2020
comment
Нет, это отдельные объекты. Они представляют собой код категории для каждой отдельной задачи в базе данных системы.   -  person jasw    schedule 29.01.2020
comment
Есть ли причина, по которой вы звоните pd.Series() crew_data['column']? Как правило, если crew_data является DataFrame, получение одного столбца уже даст вам Series?   -  person Grismar    schedule 29.01.2020
comment
В зависимости от некоторых деталей, которые неясны в вашем вопросе, на ваш вопрос, возможно, уже был дан ответ здесь in-pandas-dataframe" title="подстрока всего столбца в pandas dataframe"> stackoverflow.com/questions/36505847/   -  person Grismar    schedule 29.01.2020
comment
Спасибо за ссылку. Это сформулировано идеально. Все, что я искал по этой теме, предоставляло функцию с циклом for или что-то гораздо более запутанное, что не работало...   -  person jasw    schedule 29.01.2020
comment
Отвечает ли это на ваш вопрос? подстрока всего столбца в кадре данных pandas   -  person AMC    schedule 29.01.2020


Ответы (2)


С образцом данных

In [138]: df                                                                                     
Out[138]: 
  col1  col2 col3 newcol
0    a     1    x    Wow
1    b     2    y    Dud
2    c     1    z    Wow
In [139]: df['newcol']                                                                           
Out[139]: 
0    Wow
1    Dud
2    Wow
Name: newcol, dtype: object
In [140]: type(_)                                                                                
Out[140]: pandas.core.series.Series

Выбор столбца дает мне серию; нет необходимости в другой обертке Series

In [141]: pd.Series(df['newcol'])                                                                
Out[141]: 
0    Wow
1    Dud
2    Wow
Name: newcol, dtype: object

Мы можем поместить его в список, но это бесполезно:

In [142]: [pd.Series(df['newcol'])]                                                              
Out[142]: 
[0    Wow
 1    Dud
 2    Wow
 Name: newcol, dtype: object]
In [143]: len(_)                                                                                 
Out[143]: 1

Мы можем извлечь значения в виде массива numpy:

In [144]: pd.Series(df['newcol']).values                                                         
Out[144]: array(['Wow', 'Dud', 'Wow'], dtype=object)

Мы можем применить нарезку строки к каждому элементу массива или серии — с пониманием списка:

In [145]: [astr[:2] for astr in _144]                                                            
Out[145]: ['Wo', 'Du', 'Wo']
In [146]: [astr[:2] for astr in _141]                                                            
Out[146]: ['Wo', 'Du', 'Wo']

Понимание списка не обязательно является самым «продвинутым» способом, но это хорошее начало. На самом деле он близок к лучшему, поскольку для нарезки строки необходимо использовать строковые методы; никто другой не реализует нарезку строк.

pandas имеет метод str для применения строковых методов к серии:

In [147]: ds = df['newcol']  
In [151]: ds.str.slice(0,2)        # or ds.str[:2]                                                               
Out[151]: 
0    Wo
1    Du
2    Wo
Name: newcol, dtype: object

Это чище и красивее, чем понимание списка, но на самом деле медленнее.

person hpaulj    schedule 29.01.2020
comment
Очень красиво +1. Последний блок кода, ds.str.slice(0,2) предположительно должен быть df.str.slice(0,2) - person merit_2; 29.01.2020
comment
Я пропустил строку копирования, назначив серию Out[141] на ds. @заслуга_2 - person hpaulj; 29.01.2020

Возможно, я упускаю суть вопроса, но вот реализация регулярного выражения.

import re

# Sample data
disc = ['                       Disc - Standard Removal & Herbicide ',
 '      Disc - Standard Removal & Herbicide  ',
'                           Standard Trim  ',
'                       Disc - Hazard Tree',
'                      Disc - Hazard Tree ',]

# Regular Expression pattern
# We have Disc in parenthesis because that's what we want to capture.
# Using re.search(<pattern>, <string>).group(1) returns the first matching group. Using just
# re.search(<pattern>, <string>).group() would return the entire row.
disc_pattern = r"\s+?(Disc)\s+?"

# List comprehension that skips rows without 'Disc'
[re.search(disc_pattern, i).group(1) for i in disc if re.match(disc_pattern, i)]

Выход:

['Disc', 'Disc', 'Disc', 'Disc']
person Mark Moretto    schedule 29.01.2020