Нарезка подстроки из строки в каждой строке столбца с использованием Python - PullRequest
0 голосов
/ 03 сентября 2018

Я абсолютный новичок. У меня проблема с нарезкой строки в файле Excel с использованием Python. Мой файл Excel содержит следующую информацию:

Column 1:

ordercode   
PMC11-AA1L1FAVWJA   
PMC21-AA1A1CBVXJA   
PMP11-AA1L1FAWJJ    
PMP21-AA1A1FBWJJ    
PMP23-AA1A1FA3EJ+JA
PTP31B-AA3D1HGBVXJ  
PTC31B-AA3D1CGBWBJA 
PTP33B-AA3D1HGB1JJ  

Я хочу нарезать строку в столбце «код заказа» в зависимости от того, является ли она
«PMC11» / «PMC21» / «PMP21» / «PMP11» / «PMP23» / «PTP31B» / «PTP33B» / «PTC31B» в другом положении и сохраните его в новом столбце «диапазон давления». В Excel я использовал приведенный ниже код, и он работал нормально:

=IF(OR(ISNUMBER(SEARCH("PMC11",A2)),ISNUMBER(SEARCH("PMC21",A2)),ISNUMBER(SEARCH("PMP11",A2)),ISNUMBER(SEARCH("PMP21",A2)),ISNUMBER(SEARCH("PMP23",A2))),MID(A2,11,2),MID(A2,12,2))

но в Python я использовал приведенную ниже кодировку, и она не работала должным образом.

Код Python:

import pandas as pd
#Assigning the worksheet to file
file="Stratification_worksheet.xlsx"
#Loading the spreadsheet 
data= pd.ExcelFile(file)
#sheetname
print(data.sheet_names)
#loading the sheetname to df1
df=data.parse("Auftrag")
print(df)

#creating a new column preessurerange and slicing the pressure range from order code

for index,row in df.iterrows():
    if "PMC11" in df.loc[index,"ordercode"]:
        df["pressurerange"]=df["ordercode"].str.slice(10,12)
    elif "PMC21" in df.loc[index,"ordercode"]:
        df["pressurerange"]=df["ordercode"].str.slice(10,12)
    elif "PMP11" in df.loc[index,"ordercode"]:
        df["pressurerange"]=df["ordercode"].str.slice(10,12)
    elif "PMP21" in df.loc[index,"ordercode"]:
        df["pressurerange"]=df["ordercode"].str.slice(10,12)
    elif "PMP23" in df.loc[index,"ordercode"]:
        df["pressurerange"]=df["ordercode"].str.slice(10,12)
    elif "PTP31B" in df.loc[index,"ordercode"]:
        df["pressurerange"]=df["ordercode"].str.slice(11,13)
    elif "PTP33B" in df.loc[index,"ordercode"]:
        df["pressurerange"]=df["ordercode"].str.slice(11,13)
    elif "PTC31B" in df.loc[index,"ordercode"]:
        df["pressurerange"]=df["ordercode"].str.slice(11,13)
    else:
        df["pressurerange"]="NONE"
    print(df.loc[:,["pressurerange"]])
    break

Здесь он проверяет первое условие IF и нарезает строку в позиции (10,12) для всего столбца. Я знаю, что сделал ошибку в приведенном ниже коде. Но я не знаю, какой именно код использовать.

=df["pressurerange"]=df["ordercode"].str.slice(10,12)

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Python дает вам гораздо больше возможностей, чем Excel. Если у вас есть строка code = "PMC21-AA1A1CBVXJA", вы можете написать

pressurerange, rest = code.split("-")

и у вас есть часть до - и часть после. Я дам вам понять, как использовать это в вашем рабочем процессе.

(Примечание. Если часть rest может содержать дополнительные дефисы, используйте code.split("-", 1), чтобы ограничить разбиение одним совпадением.)

0 голосов
/ 03 сентября 2018

Я бы использовал split:

string = 'PMC11-AA1L1FAVWJA'
pressure_range, columns = string.split('-', 1)
column = columns[4:6]
0 голосов
/ 03 сентября 2018

Общее решение, работающее с данными без -, затем возвращается NaN с.

Я считаю, что нужно numpy.select с условиями, созданными str.startswith:

L1 = ["PMC11","PMC21","PMP21","PMP11","PMP23"]
L2 = ["PTP31B","PTP33B","PTC31B"]
m1 = df["ordercode"].str.startswith(tuple(L1))
m2 = df["ordercode"].str.startswith(tuple(L2))

a = df["ordercode"].str.slice(10,12)
b = df["ordercode"].str.slice(11,13)

df["pressurerange"] = np.select([m1, m2], [a, b], default=np.nan)
print (df)
             ordercode pressurerange
0    PMC11-AA1L1FAVWJA            1F
1    PMC21-AA1A1CBVXJA            1C
2     PMP11-AA1L1FAWJJ            1F
3     PMP21-AA1A1FBWJJ            1F
4  PMP23-AA1A1FA3EJ+JA            1F
5   PTP31B-AA3D1HGBVXJ            1H
6  PTC31B-AA3D1CGBWBJA            1C
7   PTP33B-AA3D1HGB1JJ            1H

Если все значения имеют -, решение должно быть упрощено с помощью str.split, затем выберите вторые списки с помощью str[1] и последний выберите 5-6 символ с помощью str[4:6] или Series.str.slice:

df["pressurerange"] = df['ordercode'].str.split('-', n=1).str[1].str[4:6]
#alternative solution
#df["pressurerange"] = df['ordercode'].str.split('-', n=1).str[1].str.slice(4,6)
print (df)
             ordercode pressurerange
0    PMC11-AA1L1FAVWJA            1F
1    PMC21-AA1A1CBVXJA            1C
2     PMP11-AA1L1FAWJJ            1F
3     PMP21-AA1A1FBWJJ            1F
4  PMP23-AA1A1FA3EJ+JA            1F
5   PTP31B-AA3D1HGBVXJ            1H
6  PTC31B-AA3D1CGBWBJA            1C
7   PTP33B-AA3D1HGB1JJ            1H
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...