Как совместить старты с IF и для pandas - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь сделать 2 вещи: во-первых, используйте начальную строку в df, чтобы определить, какие строки содержат условие, и во-вторых, добавьте указатель c TAG в столбец. Я был в состоянии сделать обе вещи правильно, но по отдельности - но безуспешно при объединении.

Это пример содержимого в столбце интересов df 'PartNumber' (GLO, GLOA, GLO1, GLOA2, GLO9, et c) общим знаменателем является «GLO», и я хочу добавить тег «Серия GLO».

Этот код может успешно идентифицировать строки, имеющие начальное условие

search = 'GLO'
search_series = df['PartNumber'].str.startswith(search, na= False)
df[search_series] 

Этот код может успешно идентифицировать строку, которая имеет указанное c условие - я знаю, что это из-за '=='. Проблема в том, что мне нужно вызвать специфическую c часть, то есть то, что я не знаю, все значения, поэтому моя попытка сделать «старты с»

df.loc[(df['PartNumber']== 'GLOA2'),'TAG_2']='Glo Series'
print (df)

Я пытался объединить оба, которые не сработало.

Я пытаюсь выполнить после завершения своего рода «Если это / то это» для нескольких условий, резюмированных следующим образом:

df [PartNumber] используется для идентификации установленных условий: основываясь на начальных символах ('GLO', 'FL0', 'MOW'), в зависимости от этого значение будет помещено в столбец набора, что приведет к ('Glo series', 'Flo series', 'Mow series')

1 Ответ

0 голосов
/ 24 апреля 2020

Предположим, что столбец TAG_2 содержит изначально некоторые другие значения (я пометил их ? ):

      ind PartNumber  Val TAG_2
0  110101        ABC   20     ?
1  110102        GLO   22     ?
2  110103       GLO1   24     ?
3  110104       GLO2   26     ?
4  110105        XYZ   28     ?

Чтобы выполнить вашу задачу за один go (при условии, что вы установили search на требуемое значение), вы можете запустить:

df.TAG_2.mask(df['PartNumber'].str.startswith(search, na=False), 'Glo Series', inplace=True)

Результат:

      ind PartNumber  Val       TAG_2
0  110101        ABC   20           ?
1  110102        GLO   22  Glo Series
2  110103       GLO1   24  Glo Series
3  110104       GLO2   26  Glo Series
4  110105        XYZ   28           ?

Часть 2

Чтобы обнаружить несколько групповых префиксов и установить для TAG_2 соответствующие имена групп, используйте другой подход.

  1. Определение серии с индексом, состоящим из «требуемые» префиксы и соответствующие имена групп в качестве значений:

    search = pd.Series(['Glo Series', 'Flo Series', 'Mow  Series'],
        index=['GLO', 'FLO', 'MOW'])
    
  2. Определите функцию для получения имени серии деталей из номера детали:

    def getSer(PartNo):
        for idx, val in search.iteritems():
            if PartNo.startswith(idx):
                return val
        return 'Alphabet start' if PartNo < search.index.min() else 'Alphabet end'
    

    Примечание что если в l oop совпадений не найдено, последняя инструкция возвращает либо 'Начало алфавита' или 'Окончание алфавита' (как вы просили в своем комментарии).

  3. Создать обновление результата TAG_2 (на месте) с результатом применения вышеуказанной функции:

    df.TAG_2.update(df.PartNumber.apply(getSer))
    

На этот раз для проверки этого кода я использовал DataFrame, содержащий:

      ind PartNumber  Val TAG_2
0  110101      ABC30   20     ?
1  110102      FLO34   22     ?
2  110103      GLO10   24     ?
3  110104      GLO22   26     ?
4  110105      XYZ26   28     ?
5  110105      MOW55   30     ?
6  110105      XYZ99   28     ?

После вышеприведенного updata результат is:

      ind PartNumber  Val           TAG_2
0  110101      ABC30   20  Alphabet start
1  110102      FLO34   22      Flo Series
2  110103      GLO10   24      Glo Series
3  110104      GLO22   26      Glo Series
4  110105      XYZ26   28    Alphabet end
5  110105      MOW55   30     Mow  Series
6  110105      XYZ99   28    Alphabet end

Если у вас есть больше «требуемых» групп, измените переменную search соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...