Замените значение в столбце csv на значение в скобках того же столбца, используя python pandas - PullRequest
0 голосов
/ 15 апреля 2019

Я получил следующий CSV-файл с образцами данных: Small part of the csv file with sample data

Теперь я хочу заменить значения столбцов «SIFT» и «PolyPhen» данными внутри скобок этих столбцов. Таким образом, для строки 1 значение SIFT заменит 0,82, а для строки 2 значение SIFT будет 0,85. Также я хочу, чтобы часть перед круглыми скобками, допускаемая / вредная, находилась внутри нового столбца с именем 'SIFT_prediction'.

Это то, что я пробовал до сих пор:

import pandas as pd
import re

testfile = 'test_sift_columns.csv'
df = pd.read_csv(testfile)  
df['SIFT'].re.search(r'\((.*?)\)',s).group(1)

Этот код будет принимать все внутри скобок столбца SIFT. Но это ничего не заменяет. Возможно, мне нужен цикл for для чтения и замены каждой строки, но я не знаю, как это сделать правильно. Также я не уверен, нужно ли использовать регулярные выражения с пандами. Может быть, есть более разумный способ решить мою проблему.

Ответы [ 2 ]

2 голосов
/ 15 апреля 2019

Использование Series.str.extract:

df = pd.DataFrame({'SIFT':['tol(0.82)','tol(0.85)','tol(1.42)'],
                   'PolyPhen':['beg(0)','beg(0)','beg(0)']})

pat = r'(.*?)\((.*?)\)'
df[['SIFT_prediction','SIFT']] = df['SIFT'].str.extract(pat)
df[['PolyPhen_prediction','PolyPhen']] = df['PolyPhen'].str.extract(pat)

print(df)
  SIFT_prediction  SIFT PolyPhen_prediction PolyPhen
0             tol  0.82                 beg        0
1             tol  0.85                 beg        0
2             tol  1.42                 beg        0

Альтернатива:

df[['SIFT_prediction','SIFT']] = df['SIFT'].str.rstrip(')').str.split('(', expand=True)
df[['PolyPhen_prediction','PolyPhen']] = df['PolyPhen'].str.rstrip(')').str.split('(', expand=True)
0 голосов
/ 15 апреля 2019

Вы можете сделать что-то вроде замены всех буквенно-цифровых значений пустыми строками, чтобы получить значение с плавающей запятой, и наоборот, чтобы получить предсказание.

import pandas as pd

df = pd.DataFrame({'ID': [1,2,3,4], 'SIFT': ['tolerated(0.82)', 'tolerated(0.85)', 'tolerated(0.25)', 'dedicated(0.5)']})
df['SIFT_formatted'] = df.SIFT.str.replace('[^0-9.]', '', regex=True).astype(float)
df['SIFT_prediction'] = df.SIFT.str.replace('[^a-zA-Z]', '', regex=True)
df

даст вам:

    ID  SIFT            SIFT_formatted  SIFT_prediction
0   1   tolerated(0.82) 0.82             tolerated
1   2   tolerated(0.85) 0.85             tolerated
2   3   tolerated(0.25) 0.25             tolerated
3   4   dedicated(0.5)  0.50             dedicated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...