Pandas:如果列A包含“x”,则有条件地将子串“y”+“z”附加到列B

时间:2015-06-20 14:28:50

标签: python regex pandas

我正在尝试找出如何根据Bregex列的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}}。

如果它不包含XnnX,请插入"1"

目前,我这样做是为了得到数字:

df["B"] = df["A"].str.extract(r"\sX(\d+)\s)", flags=re.IGNORECASE) 

(仅适用于Xn,而非nX)。

由此,我必须根据是否将"+""-""00"添加到B A包含BULLBEAR

1 个答案:

答案 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或大写字母组成,或者只是字符串末尾的数字,然后从字符串末尾分割一次并检查剥离后是否有数字