簡體   English   中英

從字符前后的數據列(字符串)中提取元素

[英]Extract elements from data column (String) before and after character

我想在字符串中的某些字符之前和之后提取一個字符,其中大部分都在熊貓數據框列中。

基本上,我想從我的主要數據框中獲取並合並來自我的列“應變”和“區域”,其中包含以下項目:

i) 原始菌株: Streptomyces_sp_QL40_O

ii) 原始區域: Region&nbsp1.1

提煉:

  1. 第二個下划線后的字符串Ex: QL40
  2. '.' 之前的第一個數字例如: nbsp。 1
  3. '.' 后的第二個數字例如: 1
  4. '&' 字符之前的字符串區域
  5. 如果數字小於 10,則在字符串 'region' 后添加兩個 0,如果數字大於 10,則添加一個 0。

所需輸出QL40_1.region001

下面的例子

    import pandas as pd 

    data = [['Streptomyces_sp_QL40_O', 'Region&nbsp1.1'], ['Streptomyces_sp_QL40_O', 'Region&nbsp2.2'], ['Streptomyces_sp_QL40_O', 'Region&nbsp2.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

這個想法是:

  • 連接您的 2 列(在它們之間插入一個“_”),
  • 調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM