Переименуйте несколько pandas имен столбцов данных с помощью функции - PullRequest
2 голосов
/ 29 марта 2020

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

Ввод:

df.columns.values = ['Time', '101 <RoomTemperature> (C)', '102 <ChemberTemperature> (C)', '103 <U1100> (C)', '103 <U1200 (C)', '103 U1500> (C)']

Испытания столбца переименования данных в соответствии с приведенным ниже кодом с использованием регулярных выражений, но это не работает. Я не мог придумать, как соединить несколько инструкций в методе df.rename.

df.rename(columns={c: c.strip() for c in df.columns.values.tolist()
                                if "<" and ">" in c: 
                  re.search(r"(?<=<).*(?=>)",c).group(0)}, inplace=True)

Я хочу, чтобы он следовал регулярному выражению и переименовал его, как показано ниже:

df.columns.values = ["Time", "RoomTemperature", "ChemberTemperature", "U1100", "103 <U1200 (C)", "103 U1500> (C)"]

Ответы [ 3 ]

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

Вы можете извлечь функциональность из функции и сделать следующее:

import re
import pandas as pd

# sample data 
df = pd.DataFrame(
    columns=['Time', '101 <RoomTemperature> (C)', '102 <ChemberTemperature> (C)', '103 <U1100> (C)', '103 <U1200 (C)',
             '103 U1500> (C)'])


# replacement function 
def repl(name):
    match = re.search(r"<(.*?)>", name)
    return match.group(1) if match else name


df.rename(columns={c: repl(c.strip()) for c in df.columns}, inplace=True)

print(df.columns)

Вывод

Index(['Time', 'RoomTemperature', 'ChemberTemperature', 'U1100',
       '103 <U1200 (C)', '103 U1500> (C)'],
      dtype='object')

При этом вам также необходимо исправить ваше регулярное выражение.

1 голос
/ 29 марта 2020

Другое решение, регулярное выражение может выглядеть недружелюбно, несмотря на его мощность:

columns = ['Time', '101 <RoomTemperature> (C)', '102 <ChemberTemperature> (C)', '103 <U1100> (C)', '103 <U1200 (C)', '103 U1500> (C)']
df = pd.DataFrame([[1,2,3,4,5,6]],columns=columns)

   p = re.compile(r'((?<=<).*?(?=>))')

  #create a dict for the replacement

  replace_dict = {w:p.search(w).group() for w in df.columns if p.search(w)}

 #pass dictionary into rename method

 df.rename(columns=replace_dict)
1 голос
/ 29 марта 2020

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

Попробуйте это:

import re

col_dict = {}
for col in df.columns:
    mobj = re.search(r"\<(.*?)\>", col)
    if mobj:
        col_dict[col] = mobj.group(1)

df.rename(columns=col_dict, inplace=True)

После переименования df.columns будет:

['Time', 'RoomTemperature', 'ChemberTemperature', 'U1100', '103 <U1200 (C)', '103 U1500> (C)']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...