我的資料框看起來像這樣-
CONTRACT Expiry Strike_price Option_type
0 AXISBANK26May2022 CE 660
1 AXISBANK26May2022 CE 690
2 AXISBANK26May2022 PE 670
3 BANKNIFTY19May2022 PE 30200
4 BANKNIFTY19May2022 PE 31200
5 BANKNIFTY26May2022 PE 34300
我想要的輸出-
CONTRACT Expiry Strike_price Option_type
0 AXISBANK26May2022 CE 660 26May2022 660 CE
1 AXISBANK26May2022 CE 690 26May2022 690 CE
2 AXISBANK26May2022 PE 670 26May2022 670 PE
3 BANKNIFTY19May2022 PE 30200 19May2022 30200 PE
4 BANKNIFTY19May2022 PE 31200 19May2022 31200 PE
5 BANKNIFTY26May2022 PE 34300 26May2022 34300 PE
我試過這樣-
df['Expiry]= df['CONTRACT'].str.extract(r'(\d{2}\D{3}\d{4})')
df['Strike_price']= df['CONTRACT'].str.extract(r'(\d{5})')
df['Option_type']= df['CONTRACT'].str.extract(r'(\D\D)')
請幫助找到沒有空格的正確列。謝謝
uj5u.com熱心網友回復:
一種選擇是str.extract:
pattern = r"[A-Z] (\d \D \d )\s ([A-Z] )\s (\d )"
extracts = df.CONTRACT.str.extract(pattern)
extracts = extracts.set_axis(['Expiry', 'Strike_price', 'Option_type'], axis = 1)
df.assign(**extracts)
CONTRACT Expiry Strike_price Option_type
0 AXISBANK26May2022 CE 660 26May2022 CE 660
1 AXISBANK26May2022 CE 690 26May2022 CE 690
2 AXISBANK26May2022 PE 670 26May2022 PE 670
3 BANKNIFTY19May2022 PE 30200 19May2022 PE 30200
4 BANKNIFTY19May2022 PE 31200 19May2022 PE 31200
5 BANKNIFTY26May2022 PE 34300 26May2022 PE 34300
另一種方法是使用str.split正則運算式,但它是一種更長的方法,并且我懷疑容易出現更多錯誤:
extracts = (df
.CONTRACT
.str.split(r"(\d \D \d )|\s ", expand = True)
.dropna(how = 'all', axis = 1)
.loc[:, lambda df: df.ne('').any()]
.iloc[:, 1:])
extracts = extracts.set_axis(['Expiry', 'Strike_price', 'Option_type'], axis = 1)
df.assign(**extracts)
CONTRACT Expiry Strike_price Option_type
0 AXISBANK26May2022 CE 660 26May2022 CE 660
1 AXISBANK26May2022 CE 690 26May2022 CE 690
2 AXISBANK26May2022 PE 670 26May2022 PE 670
3 BANKNIFTY19May2022 PE 30200 19May2022 PE 30200
4 BANKNIFTY19May2022 PE 31200 19May2022 PE 31200
5 BANKNIFTY26May2022 PE 34300 26May2022 PE 34300
uj5u.com熱心網友回復:
您可以使用
df[['Expiry','Option_type','Stike_price']] = df['CONTRACT'].str.extract(r'(\d{2}[^\W\d]{3}\d{4})\s ([A-Z] )\s (\d )$', expand=True)
請參閱正則運算式演示。詳情:
(\d{2}[^\W\d]{3}\d{4})- 第 1 組:兩位數,三個字母/下劃線,四位數字\s- 一個或多個空格([A-Z] )- 第 2 組:一個或多個大寫 ASCII 字母\s- 一個或多個空格(\d )- 第 3 組:一位或多位數字$- 字串結束。
或者,您可以利用命名捕獲組將資料提取到一個單獨的資料框中,其中列名已經定義并按預期順序,然后將兩者合并:
import pandas as pd
df = pd.DataFrame({'CONTRACT':['AXISBANK26May2022 CE 660','BANKNIFTY19May2022 PE 30200']})
df_extr = df['CONTRACT'].str.extract(r'(?P<Expiry>\d{2}[^\W\d]{3}\d{4})\s (?P<Stike_price>[A-Z] )\s (?P<Option_type>\d )$', expand=True)
df = df.merge(df_extr, left_index=True, right_index=True)
輸出:
>>> df.merge(df_extr, left_index=True, right_index=True)
CONTRACT Expiry Stike_price Option_type
0 AXISBANK26May2022 CE 660 26May2022 CE 660
1 BANKNIFTY19May2022 PE 30200 19May2022 PE 30200
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479796.html
