[英]Extract elements from data column (String) before and after character
我想在字符串中的某些字符之前和之后提取一個字符,其中大部分都在熊貓數據框列中。
基本上,我想從我的主要數據框中獲取並合並來自我的列“應變”和“區域”,其中包含以下項目:
i) 原始菌株: Streptomyces_sp_QL40_O
ii) 原始區域: Region 1.1
提煉:
所需輸出: QL40_1.region001
下面的例子
import pandas as pd
data = [['Streptomyces_sp_QL40_O', 'Region 1.1'], ['Streptomyces_sp_QL40_O', 'Region 2.2'], ['Streptomyces_sp_QL40_O', 'Region 2.1']]
df = pd.DataFrame(data, columns = ['Strain', 'Region'])
print(df)
region_list = ['QL40_1.region001', 'QL40_2.region002', 'QL40_3.region001']
我從這樣的事情開始:
df['BGC Region'] = df['Strain'].str.split('_').str[2]
print('DataFrame Modified')
df['BGC Region'] = df['BGC Region'].astype(str) + '_'
df['Region No'] = df['Region'].str.split('.').str[1]
我不確定這是否是您想要的,但它確實有效:
regions = []
for i in df['Region'].str.split('.').str[0]:
regions.append(''.join([d for d in i if d.isdigit()]))
df['BGC Region'] = df['Strain'].str.split('_').str[2] + '_' + regions + '.region'
region_number = df['Region'].str.split('.').str[1]
for i, rn in enumerate(region_number):
if int(rn) < 10:
df['BGC Region'][i] += '00' + rn
elif int(rn) < 100:
df['BGC Region'][i] += '0' + rn
這個想法是:
str.extract
來提取感興趣的部分,用帶有適當命名捕獲組的正則表達式模式指定,要實現它,請從創建一個中間 DataFrame 開始:
df2 = (df.Strain + '_' + df.Region).str.extract(
r'(?:[^_]+_){2}(?P<QL>[^_]+)_[^_]+_(?P<Rg>[^&]+)\D+(?P<D1>\d)\.(?P<D2>\d)')
對於您的數據,結果是:
QL Rg D1 D2
0 QL40 Region 1 1
1 QL40 Region 2 2
2 QL40 Region 2 1
然后定義一個合並函數,應用於來自df2 的每一行:
def mrg(row):
rg = row.Rg + '0'
if len(rg) < 11:
rg += '0'
return row.QL + '_' + row.D1 + '.' + rg + row.D2
要獲得最終結果,請運行:
region_list = df2.apply(mrg, axis=1).tolist()
結果是:
['QL40_1.Region001', 'QL40_2.Region002', 'QL40_2.Region001']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.