Переименуйте столбцы в регулярное выражение, оставьте имя, если нет совпадения - PullRequest
2 голосов
/ 24 марта 2020
data = {'First_Column': [1,2,3], 'Second_Column': [1,2,3], 
        '\First\Mid\LAST.Ending': [1,2,3], 'First1\Mid1\LAST1.Ending': [1,2,3]}

df = pd.DataFrame(data)

     First_Column   Second_Column   \First\Mid\LAST.Ending  First1\Mid1\LAST1.Ending
0    1              1               1                       1
1    2              2               2                       2
2    3              3               3                       3

Я хочу переименовать столбцы следующим образом:

     First_Column   Second_Column   LAST    LAST1
0    1              1               1        1
1    2              2               2        2
2    3              3               3        3

Итак, я попробовал:

df.columns.str.extract(r'([^\\]+)\.Ending')   

    0
0   NaN
1   NaN
2   LAST
3   LAST1

и

col = df.columns.tolist()
for i in col[2:]:
    print(re.search(r'([^\\]+)\.Ending', i).group())

LAST.Ending
LAST1.Ending

Первое, что я заметил различные выводы аргумента регулярного выражения. Это почему? Во-вторых, я предпочитаю версию с выдержкой. Но как сохранить исходное имя, если совпадения нет?

THX

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

Вы можете использовать np.where для заполнения там, где оно не соответствует:

s = df.columns.str.extract(r'([^\\]+)\.Ending')[0]

df.columns = np.where(s.isna(), df.columns, s)
# equivalently
# df.columns = s.mask(s.isna(), df.columns.values)

Вывод:

   First_Column  Second_Column  LAST  LAST1
0             1              1     1      1
1             2              2     2      2
2             3              3     3      3
2 голосов
/ 24 марта 2020

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

s = df.filter(like='\\',axis=1).columns

s1 = s.str.extract(r'([^\\]+)\.Ending')[0].tolist()

df.rename(columns=dict(zip(s,s1)))

print(df)

   First_Column  Second_Column  LAST  LAST1
0             1              1     1      1
1             2              2     2      2
2             3              3     3      3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...