Как удалить строки с шаблоном, если следующая строка совпадает с этим шаблоном? - PullRequest
1 голос
/ 06 октября 2019

У меня есть фрейм данных со столбцом, содержащим журналы для заявки на строку. Вот пример журнала:

99645,
\Submitted',
 '\Modifications made 2015/01/01',
 'x_change0:   -->  info0',
 'y_status1:   -->  info1',
 'z_change2:   -->  info2',
 'y_change3:   -->  info3',
 '\Modifications made 2015/01/03',
 '\Modifications made 2015/01/05',
 '\Modifications made 2015/01/07',
 'w_change0:   -->  info0',
 'a_status1:   -->  info1',
 '\Modifications made 2015/01/07',
.
.
.

Я хочу удалить все строки, за которыми не следуют изменения. Следующее регулярное выражение соответствует содержимому, которое я ищу RegEx101 :

pattern = '(?sm)Modifications\s*((?!Modifications\s*).)*'
re.findall(pattern, dataframe['log'])

Ожидаемый результат на ячейку в кадре данных ['log']:

Modifications made 2015/01/01',
'change0:   -->  info0',
'change1:   -->  info1',
'change2:   -->  info2',
'change3:   -->  info3',
'Modifications made 2015/01/07',
'change0:   -->  info0',
'change1:   -->  info1',
'

Как сделатьУдалить ненужные строки в ячейках? Или как заменить строку внутри ячеек отфильтрованной строкой?

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Решено с помощью решения RegEx от @Code Maniac: (?sm)Modifications[^,]+,(?:(?!^\s*'\\Modifications).)*\b.

Заменить строку ячейки следующим циклом:

pattern = r"(?sm)Modifications[^,]+,(?:(?!^\s*'\\Modifications).)*\b"
pattern = re.compile(pattern=pattern)
df['tickethist'] = ""

for i in range(len(df['log'])):
    search = []
    log = df.at[i, 'log']
    for match in pattern.findall(str(log)):
        search.append(match)
    df.at[i, 'tickethist'] = search
0 голосов
/ 06 октября 2019

Сложная фильтрация с использованием функций pd.Series.shift и str.startswith.

Исходный кадр данных:

In [87]: df                                                                                                    
Out[87]: 
                                  log
0   '\Modifications made 2015/01/01',
1            'change0:   -->  info0',
2            'change1:   -->  info1',
3            'change2:   -->  info2',
4            'change3:   -->  info3',
5   '\Modifications made 2015/01/03',
6   '\Modifications made 2015/01/05',
7   '\Modifications made 2015/01/07',
8            'change0:   -->  info0',
9            'change1:   -->  info1',
10  '\Modifications made 2015/01/07',

Удаление строк при условии (добавьте inplace=True papam кизменить на месте ):

In [88]: df.drop(df[(df.log.str.startswith("'\Modifications")) & ((df.log.shift(-1).str.startswith("'\Modificat
    ...: ions")) | (~df.log.shift(-1).str.startswith("'change", na=False)) | df.log.shift(-1).isna())].index)  
Out[88]: 
                                 log
0  '\Modifications made 2015/01/01',
1           'change0:   -->  info0',
2           'change1:   -->  info1',
3           'change2:   -->  info2',
4           'change3:   -->  info3',
7  '\Modifications made 2015/01/07',
8           'change0:   -->  info0',
9           'change1:   -->  info1',
...