繁体   English   中英

在 Pandas df 列中的两个子字符串之间提取字符串

[英]Extract string between two substrings in a pandas df column

我有以下数据框:

                                           contract
0  Future(conId=482048803, symbol='ESTX50', lastT...
1  Future(conId=497000453, symbol='XT', lastTrade...
2  Stock(conId=321100413, symbol='SXRS', exchange...
3  Stock(conId=473087271, symbol='ETHEEUR', excha...
4  Stock(conId=80268543, symbol='IJPA', exchange=...
5  Stock(conId=153454120, symbol='EMIM', exchange...
6  Stock(conId=75776072, symbol='SXR8', exchange=...
7  Stock(conId=257200855, symbol='EGLN', exchange...
8  Stock(conId=464974581, symbol='VBTC', exchange...
9  Future(conId=478135706, symbol='ZN', lastTrade...

我想创建一个包含所有符号(ESTX50、XT、SXRS...)的新“符号”列。

为了提取“symbol='”和以下单引号之间的子字符串,我尝试了以下操作:

df['symbol'] = df.contract.str.extract(r"symbol='(.*?)'")

但我得到一列 NaN。 我究竟做错了什么? 谢谢

看起来这是一列对象,而不是字符串:

import pandas as pd


class Future:
    def __init__(self, symbol):
        self.symbol = symbol

    def __repr__(self):
        return f'Future(symbol=\'{self.symbol}\')'


df = pd.DataFrame({'contract': [Future(symbol='ESTX50'), Future(symbol='XT')]})

df['symbol'] = df.contract.str.extract(r"symbol='(.*?)'")
print(df)

df

                  contract symbol
0  Future(symbol='ESTX50')    NaN
1      Future(symbol='XT')    NaN

请注意,pandas 将字符串视为object类型,因此仍然允许字符串访问器尝试执行操作。 但是,它无法提取,因为这些不是字符串。

我们可以先使用astype转换为字符串:

df['symbol'] = df.contract.astype(str).str.extract(r"symbol='(.*?)'")

df

                  contract  symbol
0  Future(symbol='ESTX50')  ESTX50
1      Future(symbol='XT')      XT

但是,更快的方法是尝试提取对象属性:

df['symbol'] = [getattr(x, 'symbol', None) for x in df.contract]

或者使用apply (可能比理解更慢)

df['symbol'] = df.contract.apply(lambda x: getattr(x, 'symbol', None))

两者都产生:

                  contract  symbol
0  Future(symbol='ESTX50')  ESTX50
1      Future(symbol='XT')      XT

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM