首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫:根据栏内容有条件地生成描述

熊猫:根据栏内容有条件地生成描述
EN

Stack Overflow用户
提问于 2015-06-25 15:41:31
回答 1查看 82关注 0票数 2

我试图解决一个函数的一些问题,该函数使用pandas regex通过str.extract获取列"name"中的每一行以生成列"description"。我使用的是regex,而不是split,因为代码必须能够管理各种格式。

必须修改该函数以承认各种条件。

DataFrame:

代码语言:javascript
复制
import pandas as pd
import re

df = pd.DataFrame(["LONG AXP UN X3 VON", "SHORT BIDU UN 5x VON", "SHORT GOOG VON", "LONG GOOG VON"], columns=["name"])

输入:

代码语言:javascript
复制
name
"LONG AXP UN X3 VON"
"SHORT BIDU UN 5x VON"
"SHORT GOOG VON"
"LONG GOOG VON"

当前代码:

代码语言:javascript
复制
description_map = {"AXP":"American Express", "BIDU":"Baidu"}
sign_map = {"LONG": "", "SHORT": "-"}
def f(strseries):
    stock = strseries.str.extract(r"\s(\S+)\s").map(description_map)
    leverage = strseries.str.extract(r"(X\d+|\d+X)\s", flags=re.IGNORECASE)
    sign = strseries.str.extract(r"(\S+)\s").map(sign_map)
    return "Tracks " + stock + " with " + sign + leverage + " leverage"

df["description"] = f(df["name"])

当前产出:

代码语言:javascript
复制
name                        description
"LONG AXP UN X3 VON"        "Tracks American Express with X3 leverage"
"SHORT BIDU UN 5x VON"      "Tracks Baidu with -5x leverage"
"SHORT GOOG VON"            ""
"LONG GOOG VON"             ""

期望产出:

代码语言:javascript
复制
name                        description
"LONG AXP UN X3 VON"        "Tracks American Express with 3x leverage"
"SHORT BIDU UN 5x VON"      "Tracks Baidu inversely with -5x leverage"
"SHORT GOOG VON"            "Tracks inversely"
"LONG GOOG VON"             "Tracks"

所涉问题:

  • 如果sign"-",我如何使它将direction = "inversely"添加到字符串中?
  • 如果stockname中与字典description_map没有匹配,则设置stock = ""并返回字符串。
  • 如果在leverage中没有找到name:忽略部分"with" + sign + leverage + " leverage"
  • sign + leverage进行拆分和重新排序,使其始终以-5x"顺序显示,而不管它是否输入为"SHORT X5"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-25 19:52:02

我花了一些时间编写这个函数:

代码语言:javascript
复制
description_map = {"AXP":"American Express", "BIDU":"Baidu"}
sign_map = {"LONG": "", "SHORT": "-"}

stock_match = re.compile(r"\s(\S+)\s")
leverage_match = re.compile("[0-9]x|x[0-9]|X[0-9]|[0-9]X")

def f(value):

    f1 = lambda x: description_map[stock_match.findall(x)[0]] if stock_match.findall(x)[0] in description_map else ''
    f2 = lambda x: leverage_match.findall(x)[0] if len(leverage_match.findall(x)) > 0 else ''
    f3 = lambda x: '-' if 'SHORT' in x else ''

    stock = f1(value)
    leverage = f2(value)
    sign = f3(value)

    statement = "Tracks " + stock

    if stock == "":
        if sign == '-':
            return statement + "{}".format('inversely')
        else:
            return "Tracks"

    if leverage[0].replace('X','x') == 'x':
        leverage = leverage[1]+leverage[0].replace('X','x')

    if leverage != '' and sign == '-':
        statement += " {} with {}{} leverage".format('inversely', sign, leverage)
    elif leverage != '' and sign == '':
        statement += " with {} leverage".format(leverage)
    else:
        if sign == '-':
            statement += " {} ".format('Inversely')

    return statement

df["description"] = df["name"].map(lambda x:f(x))

输出:

代码语言:javascript
复制
In [97]: %paste
import pandas as pd
import re

df = pd.DataFrame(["LONG AXP UN X3 VON", "SHORT BIDU UN 5x VON", "SHORT GOOG VON", "LONG GOOG VON"], columns=["name"])

## -- End pasted text --

In [98]: df
Out[98]: 
                   name
0    LONG AXP UN X3 VON
1  SHORT BIDU UN 5x VON
2        SHORT GOOG VON
3         LONG GOOG VON

In [99]: df["description"] = df["name"].map(lambda x:f(x))

In [100]: df
Out[100]: 
                   name                               description
0    LONG AXP UN X3 VON  Tracks American Express with 3x leverage
1  SHORT BIDU UN 5x VON  Tracks Baidu inversely with -5x leverage
2        SHORT GOOG VON                          Tracks inversely
3         LONG GOOG VON                                    Tracks
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31054904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档