извлечь строку по первому или второму пробелу из столбца в зависимости от значения соседних столбцов Pandas - PullRequest
0 голосов
/ 28 января 2020

У меня есть фрейм данных, который содержит коды продуктов и типы продуктов.

material_description            component_type_or_status
SF 1243545gbe ff ee rr oo       SF
LF 2324344ire ff ee rr oo       LF
BF 3434333fre ff gg hh 23       BF
IA SF 3434333fre ff gg 22 re    IA
ZZ LF 34391r33b ff tn 33        ZZ

Я хотел бы создать новый столбец под названием Код материала, который извлекает вторую или третью строку с левой стороны продукта. столбец кода в зависимости от значения типа продукта

Если SF , BF или LF , вернуть строку после первого пробела слева

Если IA или ZZ вернуть строку после второго пробела слева

Вот моя функция. Он застрял в oop, и я не уверен, что мой лог c правильный. Какой лучший способ сделать это с Pandas?

def parse_material_description(x):
    df = infile.parse(sheet_name='Unit of Measure')
    df['component_type_or_status'] = df['Material Description'].str[:2]

    try:
        if x['component_type_or_status'] == 'SF':
            df['material_code'] = df['Material Description'].str.split(" ",1)

        elif x['component_type_or_status'] == 'LF':
            df['material_code'] = df['Material Description'].str.split(" ",1)

        elif x['component_type_or_status'] == 'BF':
            df['material_code'] = df['Material Description'].str.split(" ",1)

        elif x['component_type_or_status'] == 'IA':
            df['material_code'] = df['Material Description'].str.split(" ",2)            

        elif x['component_type_or_status'] == 'ZZ':
            df['material_code'] = df['Material Description'].str.split(" ",2)            

        elif x['component_type_or_status'] == None:
            return ''
    except: IndexError

df['component_type_or_status'] = df.apply(parse_material_description, axis=1) 

Ответы [ 3 ]

1 голос
/ 28 января 2020

Я думаю, было бы немного проще использовать np.where в одной строке:

import pandas as pd
import numpy as np
data = {'material':['SF 1243545gbe ff ee rr oo','LF 2324344ire ff ee rr oo','ZZ LF 34391r33b ff tn 33'],'type':['SF','LF','ZZ']}
df = pd.DataFrame(data)
df['material_code'] = np.where(df['type'].isin(['SF','LF','BF']),df['material'].str.split(" ").str.get(1),df['material'].str.split(" ").str.get(2))
print(df)

Вывод:

                    material type material_code
0  SF 1243545gbe ff ee rr oo   SF    1243545gbe
1  LF 2324344ire ff ee rr oo   LF    2324344ire
2   ZZ LF 34391r33b ff tn 33   ZZ     34391r33b
0 голосов
/ 28 января 2020

Если ваши коды материала являются репрезентативными, вы можете сделать это вместо этого;

df['material_code'] = df['material_description'].str.extract(r'\s+([a-z0-9]+)\s+')
0 голосов
/ 28 января 2020

Вот способ сделать это:

Код:

df['material code']=''
for i in range(0,len(df['component_type_or_status'])):
    if (df['component_type_or_status'][i] == 'SF') or (df['component_type_or_status'][i] == 'LF') or (df['component_type_or_status'][i] == 'BF'):
        df['material code'][i]=' '.join(df['material_description'][i].split()[1:2])
    else:
        df['material code'][i]=' '.join(df['material_description'][i].split()[2:3])

Выход:

    material_description            component_type_or_status    material code
0   SF 1243545gbe ff ee rr oo       SF                          1243545gbe
1   LF 2324344ire ff ee rr oo       LF                          2324344ire
2   BF 3434333fre ff gg hh 23       BF                          3434333fre
3   IA SF 3434333fre ff gg 22 re    IA                          3434333fre
4   ZZ LF 34391r33b ff tn 33        ZZ                          34391r33b

df здесь ваш исходный фрейм данных.

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