我们有这个:
def get_prices():
prices = pd.read_json("https://api.binance.com/api/v1/ticker/allPrices")
prices_df = pd.DataFrame(prices)
prices_df.columns = ["Price","Symbol"]
prices_df = prices_df.set_index("Symbol")
prices_df["Asset"] = "??"
prices_df["Quote"] = "??"
return prices_df
这里的"符号"是由"资产"+"报价"符号组成的一对,没有任何分隔。更难的是,"资产"one_answers"报价"的长度不同。示例:LTCBTC、BNBUSDT、NEOBTC、QTUMETH(您可以通过运行该功能来检查更多样本(
但我们知道"报价"符号只能是4:"USDT"、"BTC"、"ETH"、"BNB">
那么,我们使用哪些代码来定义数据帧中的每一列("Asset"one_answers"Quote"(呢?
您可以使用的正则表达式是^w+(USDT|BTC|ETH|BNB)$
,它匹配以一个或多个单词字符(w+
(开头、以USDT
、BTC
、ETH
或BNB
子字符串之一结尾的字符串。但是,您需要对其进行调整,以便与Pandas一起使用。
您可以使用str.extract
通过用捕获圆括号包装相应的模式部分来用正确的值填充列:
prices_df["Asset"] = prices_df["Symbol"].str.extract(r'^(w+)(?:USDT|BTC|ETH|BNB)$', expand=False).fillna('')
prices_df["Quote"] = prices_df["Symbol"].str.extract(r'^w+(USDT|BTC|ETH|BNB)$', expand=False).fillna('')
您也可以使用命名的捕获组str.extract
值并创建相应的列:
prices_df = prices_df.join(prices_df['Symbol'].str.extract(r'^(?P<Asset>w+)(?P<Quote>USDT|BTC|ETH|BNB)$', expand=True))
Pandas演示代码:
import pandas as pd
df = pd.DataFrame({'Symbol':['LTCBTC','BNBUSDT','NEOBTC','QTUMETH']})
df = df.join(df['Symbol'].str.extract(r'^(?P<Asset>w+)(?P<Quote>USDT|BTC|ETH|BNB)$', expand=True))
输出:
>>> df
Symbol Asset Quote
0 LTCBTC LTC BTC
1 BNBUSDT BNB USDT
2 NEOBTC NEO BTC
3 QTUMETH QTUM ETH