我是绝对的初学者。我在使用Python将Excel文件中的字符串切片时遇到问题。我的Excel文件包含以下信息:
Column 1:
ordercode
PMC11-AA1L1FAVWJA
PMC21-AA1A1CBVXJA
PMP11-AA1L1FAWJJ
PMP21-AA1A1FBWJJ
PMP23-AA1A1FA3EJ+JA
PTP31B-AA3D1HGBVXJ
PTC31B-AA3D1CGBWBJA
PTP33B-AA3D1HGB1JJ
我想根据是否为“ ordercode”列中的字符串进行切片
“ PMC11” /“ PMC21” /“ PMP21” /“ PMP11” /“ PMP23” /“ PTP31B” /“ PTP33B” /“ PTC31B”在不同位置,并将其保存在新列“ pressurerange”中。在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)
答案 0 :(得分:1)
一般解决方案使用无-
的数据,然后返回NaN
s。
我认为有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]
{3}}:
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
答案 1 :(得分:1)
Python比Excel提供了更多的选择。如果您有字符串code = "PMC21-AA1A1CBVXJA"
,则可以编写
pressurerange, rest = code.split("-")
,而您在-
之前的部分以及之后的部分。我会让你弄清楚如何在工作流程中使用它。
(注意:如果rest
部分可以包含其他连字符,请使用code.split("-", 1)
将拆分限制为一个匹配项。)
答案 2 :(得分:0)
我将使用split:
string = 'PMC11-AA1L1FAVWJA'
pressure_range, columns = string.split('-', 1)
column = columns[4:6]