![](/img/trans.png)
[英]Python Pandas compare two dataframes with a similar (string) column, where 1 df's values are substrings of the other df's values
[英]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.