我有以下数据框:
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
关于python - 提取 pandas df 列中两个子字符串之间的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69780576/