gpt4 book ai didi

python - Pandas str.extract : AttributeError: 'str' object has no attribute 'str'

转载 作者:太空宇宙 更新时间:2023-11-03 17:37:16 27 4
gpt4 key购买 nike

我正在尝试将此函数从使用 split 改为使用 str.extract (正则表达式)。

def bull_lev(x):
spl = x.rsplit(None, 2)[-2].strip("Xx")
if spl.str.isdigit():
return "+" + spl + "00"
return "+100"

def bear_lev(x):
spl = x.rsplit(None, 2)[-2].strip("Xx")
if spl.str.isdigit():
return "-" + spl + "00"
return "-100"

df["leverage"] = df["name"].map(lambda x: bull_lev(x)
if "BULL" in x else bear_lev(x) if "BEAR" in x else "+100"
<小时/>

我使用pandas进行DataFrame处理:

import pandas as pd
df = pd.DataFrame(["BULL AXP UN X3 VON", "BEAR ESTOX 12x S"], columns=["name"])

期望的输出:

name                    leverage
"BULL AXP UN X3 VON" "+300"
"BEAR ESTOX 12x S" "-1200"
<小时/>

“BULL”的错误正则表达式尝试:

def bull_lev(x):
#spl = x.rsplit(None, 2)[-2].strip("Xx")
spl = x.str.extract(r"(X\d+|\d+X)\s", flags=re.IGNORECASE).strip("x")
if spl.str.isdigit():
return "+" + spl + "00"
return "+100"

df["leverage"] = df["name"].map(lambda x: bull_lev(x)
if "BULL" in x else bear_lev(x) if "BEAR" in x else "+100")

产生错误:

Traceback (most recent call last):
File "toolkit.py", line 128, in <module>
df["leverage"] = df["name"].map(lambda x: bull_lev(x)
File "/Python/Virtual/py2710/lib/python2.7/site-packages/pandas/core/series.py", line 2016, in map
mapped = map_f(values, arg)
File "pandas/src/inference.pyx", line 1061, in pandas.lib.map_infer (pandas/lib.c:58435)
File "toolkit.py", line 129, in <lambda>
if "BULL" in x else bear_lev(x) if "BEAR" in x else "+100")
File "toolkit.py", line 123, in bear_lev
spl = x.str.extract(r"(X\d+|\d+X)\s", flags=re.IGNORECASE).strip("x")

AttributeError: 'str' object has no attribute 'str'

我假设这是由于 str.extract 捕获列表而 split 直接处理字符串?

最佳答案

您可以使用以下方法处理积极的情况:

In [150]:
import re
df['fundleverage'] = '+' + df['name'].str.extract(r"(X\d+|\d+X)\s", flags=re.IGNORECASE).str.strip('X') + '00'
df

Out[150]:
name fundleverage
0 BULL AXP UN X3 VON +300
1 BULL ESTOX X12 S +1200

您可以使用 np.where 在一个衬垫中处理这两种情况:

In [151]:
df['fundleverage'] = np.where(df['name'].str.extract(r"(X\d+|\d+X)\s", flags=re.IGNORECASE).str.strip('X').str.isdigit(), '+' + df['name'].str.extract(r"(X\d+|\d+X)\s", flags=re.IGNORECASE).str.strip('X') + '00', '+100')
df

Out[151]:
name fundleverage
0 BULL AXP UN X3 VON +300
1 BULL ESTOX X12 S +1200

所以上面使用了向量化的str方法strip , extractisdigit来实现你想要的。

更新

更改需求后(您不应该这样做以供将来引用),您可以屏蔽牛市和熊市情况的 df:

In [189]:
import re
df = pd.DataFrame(["BULL AXP UN X3 VON", "BEAR ESTOX 12x S"], columns=["name"])
bull_mask_name = df.loc[df['name'].str.contains('bull', case=False), 'name']
bear_mask_name = df.loc[df['name'].str.contains('bear', case=False), 'name']
df.loc[df['name'].str.contains('bull', case=False), 'fundleverage'] = np.where(bull_mask_name.str.extract(r"(X\d+|\d+X)\s", flags=re.IGNORECASE).str.strip('X').str.isdigit(), '+' + bull_mask_name.str.extract(r"(X\d+|\d+X)\s", flags=re.IGNORECASE).str.strip('X') + '00', '+100')
df.loc[df['name'].str.contains('bear', case=False), 'fundleverage'] = np.where(bear_mask_name.str.extract(r"(X\d+|\d+X)\s", flags=re.IGNORECASE).str.strip('x').str.isdigit(), '-' + bear_mask_name.str.extract(r"(X\d+|\d+X)\s", flags=re.IGNORECASE).str.strip('x') + '00', '-100')
df

Out[189]:
name fundleverage
0 BULL AXP UN X3 VON +300
1 BEAR ESTOX 12x S -1200

关于python - Pandas str.extract : AttributeError: 'str' object has no attribute 'str' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31046060/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com