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

2024-04-24 07:25:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找出如何根据pandas中列Aregex有条件地将每行的子字符串添加到列B。你知道吗

假设我有这个数据帧:

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。你知道吗

如果它不包含XnnX,则插入"1"。你知道吗

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

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

(仅适用于Xn,不适用于nX)。你知道吗

从那以后,我必须根据是否需要在"+""-""00"中添加BA包含BULLBEAR。你知道吗


Tags: 数据字符串applepandasdf条件regexgoog
1条回答
网友
1楼 · 发布于 2024-04-24 07:25:24

如果你总是让X跟一些数字:

 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)

输出:

               A     B
0  BULL APPLE X2  +200
1  BEAR APPLE X3  -300
2   BULL GOOG 2X  +200
3   BEAR GOOG 3X  -300
4      BULL TSLA  +100
5      BEAR TSLA  -100
6        FOO BAR  +100

除非在字符串末尾有其他由小写和大写x组成的单词,或者只有数字,否则从字符串末尾拆分一次,并检查剥离后是否有数字

相关问题 更多 >