我正在尝试找出如何根据B
中regex
列的A
,有条件地将每行的子字符串添加到列pandas
。
说我有这个DataFrame:
df = pd.DataFrame(["BULL APPLE X2","BEAR APPLE X3","BULL GOOG 2X",
"BEAR GOOG 3X", "BULL TSLA", "BEAR TSLA"], columns=["A"])
期望的输出:
A B
"BULL APPLE X2" "+200"
"BEAR APPLE X3" "-300"
"BULL GOOG 2x" "+200"
"BEAR GOOG 3x" "-300"
"BULL TSLA" "+100"
"BEAR TSLA" "-100"
因此,如果A
包含"X2"
,请"2"
与regex
一起使用,然后在"+"
之前添加"00"
,然后写入B
{1}}。
如果它不包含Xn
或nX
,请插入"1"
。
目前,我这样做是为了得到数字:
df["B"] = df["A"].str.extract(r"\sX(\d+)\s)", flags=re.IGNORECASE)
(仅适用于Xn
,而非nX
)。
由此,我必须根据是否将"+"
或"-"
和"00"
添加到B
A
包含BULL
或BEAR
。
答案 0 :(得分:3)
如果你总是有X后跟一些数字:
while((0 + 1) != -1) // false
我有一个正则表达式解决方案,但它很难看,取决于你的数据,然后拆分可以完成这项工作:
r = re.compile(r"X(\d)$")
df["B"] = df["A"].map(lambda x: "+"+r.search(x).group(1)+"00"
if "BULL" in x else "-"+r.search(x).group(1)+"00"if "BEAR" in x else "")
print(df)
A B
0 BULL APPLE X2 +200
1 BEAR APPLE X3 -300
2 BULL APPLE X4 +400
输出:
def f1(x):
spl = x.rsplit(None, 1)[1].strip("Xx")
if spl.isdigit():
return "+" + spl + "00"
return "+100"
def f2(x):
spl = x.rsplit(None, 1)[1].strip("Xx")
if spl.isdigit():
return "-" + spl + "00"
return "-100"
df = pd.DataFrame(["BULL APPLE X2", "BEAR APPLE X3", "BULL GOOG 2X", "BEAR GOOG 3X", "BULL TSLA", "BEAR TSLA","FOO BAR"],
columns=["A"])
df["B"] = df["A"].map(lambda x: f1(x)
if "BULL" in x else f2(x) if "BEAR" in x else "+100")
print(df)
除非你有其他单词由大写x或大写字母组成,或者只是字符串末尾的数字,然后从字符串末尾分割一次并检查剥离后是否有数字