【问题标题】:Extract string between two substrings in a pandas df column在 pandas df 列中的两个子字符串之间提取字符串
【发布时间】:2021-12-15 05:15:45
【问题描述】:

我有以下数据框:

                                           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。 我究竟做错了什么?谢谢

【问题讨论】:

    标签: python pandas string


    【解决方案1】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2022-08-15
      • 2013-01-31
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      相关资源
      最近更新 更多