Расширенное управление строковыми данными - PullRequest
1 голос
/ 26 марта 2020

У меня есть dataframe и column интерес в довольно грязном. Я попытался выполнить некоторые matching strings, но они не работают.

Данные поступают с веб-сайта, поэтому в столбце есть сообщение. Меня интересует структура списка чисел. Вот как выглядит фрейм:

169508                                                  [3]
169509                                               [3, 4]
169510                                                  [3]
169511                                                  [3]
169512                                                  [3]
169513                                                  [6]
169514                                               [3, 4]
169515                                               [3, 4]
169516                                               [3, 4]
169517                                                  [6]
169518    [6) AND ORD(MID((SELECT IFNULL(CAST(COUNT(DIST...
169519    [6) AND ORD(MID((SELECT IFNULL(CAST(COUNT(DIST...
169520    [6) AND ORD(MID((SELECT IFNULL(CAST(COUNT(DIST...
169521    [6) AND ORD(MID((SELECT IFNULL(CAST(COUNT(DIST...
169522    [6) AND 2831=IF((ORD(MID((SELECT IFNULL(CAST(C...
169523    [6) AND 2831=IF((ORD(MID((SELECT IFNULL(CAST(C...
169524    [6) AND 2831=IF((ORD(MID((SELECT IFNULL(CAST(C...
169525                                                  [6]
169526    [6) AND 2831=IF((ORD(MID((SELECT IFNULL(CAST(C...
169527                                                  [3]
169528                                                  [2]
169529                                               [3, 4]
169530                                                  [3]
169531                                                  [6]
169532                                               [3, 4]

Вот такой вывод, который я ожидаю:

    type_prod

0   ['3']
1   ['6']
2   ['3','4']
3   ['3','4','6']
4   ['3','4']
5   ['6']
6   ['6']
7   ['5']
8   ['5']
9   ['3', '4', '1']
10  ['6', '2', '5', '1']
11  ['3', '4']
12  ['3', '4']
13  ['6', '2', '5', '1']
14  ['3', '4']
15  ['3', '4']
16  ['3', '4']
17  ['3', '4']
18  ['3', '4']
19  ['3', '4']
20  ['3', '4']
21  ['3', '4']
22  ['3', '4']
23  ['3', '4']
24  ['6']
25  ['6']
26  ['6']

1 Ответ

1 голос
/ 26 марта 2020

вы можете использовать регулярное выражение и применить, но трудно сказать, когда вы хотите, чтобы только один номер возвращался в индексах с 24 по 26. Я предполагаю, что если строка содержит 'И', то просто верните первое число, которое основано на пример - символ два.

import re

messydf['type_prod'].apply(lambda x: list(re.sub("[^0-9]", "", x)) if 'AND' not in x  else list(x[2]))

обновление для работы со списком, а не со строками

from io import StringIO
import pandas as pd
import ast
import re

# prepare sample data
s = """index;type_prod
169508;[3]
169509;[3, 4]
169510;[3]
169511;[3]
169512;[3]
169513;[6]
169514;[3, 4]
169515;[3, 4]
169516;[3, 4]
169517;[6]
169518;['6) AND ORD(MID((SELECT IFNULL(CAST(COUNT(DIST...']
169519;['6) AND ORD(MID((SELECT IFNULL(CAST(COUNT(DIST...']
169520;['6) AND ORD(MID((SELECT IFNULL(CAST(COUNT(DIST...']
169521;['6) AND ORD(MID((SELECT IFNULL(CAST(COUNT(DIST...']
169522;['6) AND 2831=IF((ORD(MID((SELECT IFNULL(CAST(C...']
169523;['6) AND 2831=IF((ORD(MID((SELECT IFNULL(CAST(C...']
169524;['6) AND 2831=IF((ORD(MID((SELECT IFNULL(CAST(C...']
169525;[6]
169526;['6) AND 2831=IF((ORD(MID((SELECT IFNULL(CAST(C...']
169527;[3]
169528;[2]
169529;[3, 4]
169530;[3]
169531;[6]
169532;[3, 4]"""

messydf = pd.read_csv(StringIO(s), sep=';')
messydf = messydf.set_index('index')
messydf['type_prod'] = messydf['type_prod'].apply(ast.literal_eval)

# lambda function with re
messydf['type_prod'] = messydf['type_prod'].apply(lambda x: list(re.sub("[^0-9]", "", str(x)))\
                                                  if 'AND' not in str(x) else list(str(x)[2]))
print(messydf)

       type_prod
index           
169508       [3]
169509    [3, 4]
169510       [3]
169511       [3]
169512       [3]
169513       [6]
169514    [3, 4]
169515    [3, 4]
169516    [3, 4]
169517       [6]
169518       [6]
169519       [6]
169520       [6]
169521       [6]
169522       [6]
169523       [6]
169524       [6]
169525       [6]
169526       [6]
169527       [3]
169528       [2]
169529    [3, 4]
169530       [3]
169531       [6]
169532    [3, 4]
...