Я пытаюсь добавить новые заголовки столбцов к кадру данных, которые могут конфликтовать с существующими заголовками данных.

Я хотел бы использовать df.replace(to_replace, replacements, regex=True) для замены любых целых слов, которые соответствуют существующим столбцам df, словом из списка замен.

В качестве примера:

Если текущий df.columns = ['Test 1', 'Test 2']

Я хотел бы заменить все строки «Test 1» в df на «Test 1_Test 1»

Если я использую:

df.replace(r'\bTest 1\b', 'Test 1_Test1', regex=True) 

Я могу заменить только экземпляры «Test 1», однако я хотел бы обобщить это, чтобы иметь возможность заменить все экземпляры заголовков столбцов другим словом.

Мое понимание основной причины заключается в том, что я не генерирую список выражений регулярных выражений правильно и хотел бы знать, как это сделать.

В настоящее время я использую:

replace_list = list( r'\b' + pd.Series(list(df.columns)) + '\b')

Однако это не работает.

Любая помощь приветствуется.

1
wingsoficarus116 9 Янв 2017 в 20:32

3 ответа

Лучший ответ

Поскольку переменная, которую вы передаете шаблону регулярных выражений, выглядит как word1|word2|more_here, вы можете использовать

r'(?:\b|(?<=_))(?:' + pd.Series(list(df.columns)) + r')(?=\b|_)'

Этот шаблон будет соответствовать одной из альтернатив между границами слов или подчеркиванием. Причина чередования внутри lookhehind и lookahead заключается в том, что граница слова сама по себе требует неслова char с любой стороны от искомого слова, а это означает, что подчеркивание, будучи символами слова, может не соответствовать.

1
Wiktor Stribiżew 10 Янв 2017 в 16:00

Попробуйте по-другому подумать об этой задаче - намного проще и намного быстрее переименовать исходные имена столбца :

In [228]: df
Out[228]:
                       Test 1                      Test 2
0              Will this work  Test 2: Is this even legit
1  Test 1: Maybe it will work                        nope
2   It probably will not work                        nope

In [229]: df.add_prefix('~~').add_suffix('~~')
Out[229]:
                   ~~Test 1~~                  ~~Test 2~~
0              Will this work  Test 2: Is this even legit
1  Test 1: Maybe it will work                        nope
2   It probably will not work                        nope
0
MaxU 9 Янв 2017 в 21:41

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

import pandas as pd
import numpy as np
df=pd.DataFrame([['aa','bb','cc','dd','ee'],
                 ['aa','Test2','cc','dd','ee'],
                ['aa','bb','cc','Test4','ee'],
                ['aa','bb','cc','dd','ee']])
df.columns=['Test1','Test2','Test3','Test4','Test5']

print df

cols=pd.Series(df.columns)


for col in cols:
    replacevalue=col+'_'+col
    df[col] =df[col].replace(col,replacevalue)
print df

Вход

  Test1  Test2 Test3  Test4 Test5
0    aa     bb    cc     dd    ee
1    aa  Test2    cc     dd    ee
2    aa     bb    cc  Test4    ee
3    aa     bb    cc     dd    ee

Выход

  Test1        Test2 Test3        Test4 Test5
0    aa           bb    cc           dd    ee
1    aa  Test2_Test2    cc           dd    ee
2    aa           bb    cc  Test4_Test4    ee
3    aa           bb    cc           dd    ee
0
Shijo 10 Янв 2017 в 14:18