Как использовать заполнители в цикле for? - PullRequest
3 голосов
/ 22 октября 2019

У меня есть следующий код:

df['Variable Name']=df['Variable Name'].replace(' 15 °',' at 15 °', regex=True)
df['Variable Name']=df['Variable Name'].replace(' at at 15 °',' at 15 °', regex=True)
df['Variable Name']=df['Variable Name'].replace(' 0 °',' at 0 °', regex=True)
df['Variable Name']=df['Variable Name'].replace(' at at 0 °',' at 0 °', regex=True)
df['Variable Name']=df['Variable Name'].replace(' 5 °',' at 5 °', regex=True)
df['Variable Name']=df['Variable Name'].replace(' at at 5 °',' at 5 °', regex=True)

И хотелось бы знать, как его сократить. Я пробовал цикл for:

for x in range(0,15,5):
    df['Variable Name']=df['Variable Name'].replace(' %s °',' at %s °', x, regex=True)
    df['Variable Name']=df['Variable Name'].replace(' at at %s °',' at %s °', x, regex=True)

Но я получаю сообщение об ошибке:

ValueError: For argument "inplace" expected type bool, received type int.

Какой лучший способ сделать это?

Редактировать: Добавлен фрагмент

Variable Name                          Condition
Density 15 °C (g/mL)   
Density 0 °C (g/mL)    
Density 5 °C (g/mL)    
Calculated API Gravity  
Viscosity at 15 °C (mPa.s) 
Viscosity at 0 °C (mPa.s)  
Viscosity at 5 °C (mPa.s)  
Surface tension 15 °C (oil - air)  
Interfacial tension 15 °C (oil - water)    

Ответы [ 4 ]

3 голосов
/ 22 октября 2019

Используйте группы захвата с отрицательным внешним видом:

import pandas as pd

s = pd.Series([' 15 °', ' at 15 °', ' 0 °', ' at 0 °', ' 5 °', ' at 5 °'])
s = s.str.replace('(?<!at)\s+(15|0|5) °', r' at \1 °', regex=True)
print(s)

Вывод

0     at 15 °
1     at 15 °
2      at 0 °
3      at 0 °
4      at 5 °
5      at 5 °
dtype: object

Как указывает regex=True, мы собираемся заменить с помощью обычноговыражение, шаблон (?<!at)\s+(15|0|5) ° означает совпадение с 15, 0 или 5, которое не имеет at (как предыдущее слово) перед ним. Обозначение (?<!at) известно как отрицательный взгляд сзади, что-то вроде взгляда на предыдущие символы и проверки, не совпадают ли они с чем-либо, в данном случае at. (15|0|5) - это группа захвата, каждая группа захвата имеет соответствующий индекс, который вы можете использовать в шаблоне замены, как в «at \ 1 °». Так, например, шаблон будет заменять только 15, которому не предшествует at, на at 15.

0 голосов
/ 22 октября 2019

За один проход с диктом регулярных выражений :

In [113]: df = pd.DataFrame(columns=['Variable Name'], data=[' 15 °', ' at at 15 °', ' 0 °', ' at at 0 °', '
     ...:  5 °', ' at at 5 °'])                                                                             

In [114]: df['Variable Name'].replace(regex={r'^\s*(\d+) °': r'at \1 °', r'at at (\d+) °': r' at \1 °'})    
Out[114]: 
0      at 15 °
1      at 15 °
2       at 0 °
3       at 0 °
4       at 5 °
5       at 5 °
Name: Variable Name, dtype: object
0 голосов
/ 22 октября 2019

Вы можете спасти себя от replace с дополнительной группой захвата:

s = pd.Series(['that at 15 °', 'this 15 °', 
               'that at 5 °', 'this 5 °', 
               'that at 0 °', 'this 0 °'])

for x in [0, 5, 15]:
    s = s.str.replace(f'((?: at)? {x} °)', f' at {x} °')

Вывод:

0    that at 15 °
1    this at 15 °
2     that at 5 °
3     this at 5 °
4     that at 0 °
5     this at 0 °
dtype: object
0 голосов
/ 22 октября 2019

Не уверен, почему вы используете флаг RegEx, но он вам не нужен. inplace является третьим аргументом и нуждается в логическом значении, но вы указали x в качестве третьего аргумента, поэтому он потерпел неудачу. Вы не использовали % форматирование должным образом.

По полному совпадению, inplace также можно использовать для упрощения проблемы. Вам не нужно переназначать в этом случае. Вот хороший (ish) код:

for x in (0, 5, 15): # You were using range() wrong - this is correct
    df['Variable Name'].replace(' %s °' % x,' at %s °' % x, inplace=True)
    df['Variable Name'].replace(' at at %s °' % x,' at %s °' % x, inplace=True)

Старайтесь избегать форматирования %, если вы можете использовать .format() и f-строки. Но это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...