Переименование нескольких столбцов панд с помощью регулярных выражений - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь привести в порядок CSV, который мне дали, где столбцы сейчас не очень удобны для разработчиков. Я хотел бы использовать регулярные выражения, чтобы найти несколько шаблонов в именах столбцов, чтобы заменить несколько условий. Например, учитывая df1 с leading/trailed spaces, white space в заголовке, круглые скобки () и <, тогда я хотел бы удалить leading/trailing spaces и parenthesis, заменить white space на _ и замените < на LESS_THAN

Например, превращение df1 в df2:

df1 = pd.DataFrame({' APPLES AND LEMONS': [1,2], ' ORANGES ([POUNDS]) ': [2,1], ' BANANAS < 5 ': [8,9]})

APPLES AND LEMONS   ORANGES (POUNDS)    BANANAS < 5

0                   1                     2              8
1                   2                     1              9

df2 = pd.DataFrame({'APPLES_AND_LEMONS': [1,2], 'ORANGES_POUNDS': [2,1], 'BANANAS_LESS_THAN_5 ': [8,9]})

   APPLES_AND_LEMONS  ORANGES_POUNDS  BANANAS_LESS_THAN_5
0                  1               2                     8
1                  2               1                     9

Моя текущая реализация - просто объединение в цепочку str.replaces. Есть лучший способ сделать это? Я думал, что регулярные выражения могут быть особенно полезны, потому что есть сотни столбцов, и я уверен, что будет еще несколько головных болей, которые мне еще предстоит найти.

df1.columns = df1.columns.str.strip()
df1.columns = concatenated_df.columns.str.replace(' ','_').str.replace('<','LESS_THAN').str.replace('(', '').str.replace(')','')

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Не уверен, что это лучше для вас.

old_cols = list(df1.columns.values)

remove = re.compile(r'^\s+|\s+$|[\(\)\[\]]')
wspace = re.compile(r'\s+')
less = re.compile(r'<')
great = re.compile(r'>')

new_cols = []

for i in old_cols:
    i = re.sub(remove, "", i)
    i = re.sub(wspace, "_", i)
    i = re.sub(less, "LESS_THAN", i)
    i = re.sub(less, "GREATER_THAN", i)
    new_cols.append(i)

df1.columns = new_cols
0 голосов
/ 29 апреля 2019

Благодаря ссылке, которую дал мне Алоллз, я смог получить решение, которое гораздо проще поддерживать, чем непрерывную цепочку str.replace

def clean_column_names(df):

    df.columns = df.columns.str.strip()
    replace_dict = {' ': '_', '<': 'LESS_THAN', '(': '', ')':''}
    for i, j in replace_dict.items():
        new_columns = [column.replace(i, j) for column in df.columns]
        df.columns = new_columns

    return df

clean_column_names(df1)

   APPLES_AND_LEMONS  ORANGES_POUNDS  BANANAS_LESS_THAN_5
0                  1                 2                    8
1                  2                 1                    9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...