我是python的新手,正在尝试编写以下代码。我可以使用for循环对行进行迭代,但是可以查看是否可以向量化或不使用for循环。
Col1 Col2
ABC A
ABC1 B
CA C
PU C
XYZ A
我想做的是: 如果Col1仅包含大写字母-然后将Col2更新为“ A” 如果Col1具有特定的字符串“ CA”或“ PU”-然后将Col2更新为“ C” 如果Col1具有字母数字值-然后将Col2更新为'B'
任何帮助将不胜感激。
答案 0 :(得分:4)
对于条件的重叠以及对它们进行优先排序的顺序,您必须非常小心。为了得到您的要求,我使用np.select
cond0 = df.Col1.str.isalpha()
cond1 = df.Col1.str.isupper()
cond2 = df.Col1.isin(['CA', 'PU'])
cond3 = df.Col1.str.isalnum()
df.assign(Col2=np.select([cond2, cond0 & cond1, cond3], ['C', 'A', 'B']))
Col1 Col2
0 ABC A
1 ABC1 B
2 CA C
3 PU C
4 XYZ A
或使用map
def all_the_conditions(s):
if s in {'CA', 'PU'}:
return 'C'
elif s.isalpha() and s.isupper():
return 'A'
elif s.isalnum():
return 'B'
else:
return '¯\_(ツ)_/¯'
df.assign(Col2=df.Col1.map(all_the_conditions))
Col1 Col2
0 ABC A
1 ABC1 B
2 CA C
3 PU C
4 XYZ A
答案 1 :(得分:1)
使用正则表达式就可以做到
df[df["col1"].str.contains(r"\b[A-Z]+\b", case=True)]["col2"] = "A"
df[df["col1"].isin(["CA", "PU"])]["col2"] = "C"
df[df["col1"].str.contains(".*?\d+.*?", regex=True)]["col2"] = "B"
希望这会起作用
如@walterTross所建议,我们也可以使用它
df[df["col1"].str.contains(r"^[A-Z]+$", case=True)]["col2"] = "A"
df[df["col1"].str.contains("^[A-Z0-9]$", regex=True)]["col2"] = "B"
感谢Walter:)
答案 2 :(得分:1)
这是np.select
的好用例:
import numpy as np
c1 = df.Col1.str.isupper()
c2 = df.Col1.isin(['CA','PU'])
c3 = df.Col1.str.contains(r'\d')
df['Col2'] = np.select([c1 & ~(c2 | c3), c2, c3], ['A', 'C', 'B'])
print(df)
Col1 Col2
0 ABC A
1 ABC1 B
2 CA C
3 PU C
4 XYZ A