Извлечение элементов из столбца данных (String) до и после символа - PullRequest
1 голос
/ 09 марта 2020

Я хочу извлечь символ до и после определенных символов в строке, большинство из них находятся в столбце pandas данных.

По сути, я хочу взять из моего основного блока данных и объединить его из моих столбцов «Штамм» и «Регион», используя следующие элементы:

i) Исходный штамм: Streptomyces_sp_QL40_O

ii) Исходный регион: Регион 1,1

Извлечение:

  1. Строка после второго подчеркивания Пример: QL40
  2. Первый номер перед '.' Пример: nbsp. 1
  3. Второй номер после '.' Пример: . 1
  4. Строковая область перед символом '&'
  5. Добавить два 0 после строки 'region', если di git меньше 10 и один 0, если di git больше десяти.

Желаемый выход : 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]

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Идея состоит в том, чтобы:

  • объединить ваши 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']
1 голос
/ 09 марта 2020

Я не совсем уверен, если это то, что вы хотите, но это делает работу:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...