Удаление первого и последнего символа по условию в Pandas

Рейтинг: 0Ответов: 4Опубликовано: 11.08.2023

Есть датафрейм вида:

df = pd.DataFrame(
    {'COL1': [',a1', ',a3', 'm100', 'w23'], 'COL2': [',a2', ',n1', ',k12', ','], 'COL3': ['a3', 'v4', '', 'y33'],
     'COL4': ['d1', ',v8', 'w54', 'e17']})

Как можно удалить в столбце на выбор первый символ, если он запятая. Так же и с последним символом - удалить если он занятая. Спасибо.

Ответы

▲ 1Принят

Применяем .apply по нужной колонке, если первый/последний символ не запятая возвращаем значение без изменений, если запятая - возвращаем значение без первого/последнего символа.

df.COL1 = df.COL1.apply(lambda x: x if not x or x[0] != ',' else x[1:])
df.COL1 = df.COL1.apply(lambda x: x if not x or x[-1] != ',' else x[:-1])

По всему df применяем .applymap

df = df.applymap(lambda x: x if not x or x[0] != ',' else x[1:])
df = df.applymap(lambda x: x if not x or x[-1] != ',' else x[:-1])
▲ 4

Воспользуйтесь готовыми методами:

df = df.apply(lambda x: x.str.strip(','))

Если нужно провести эти операции только, например, в первой и последней колонках, то можно сделать через локатор:

df.iloc[:,[0,-1]] = df.iloc[:,[0,-1]].apply(lambda x: x.str.strip(','), axis=1)
▲ 1

Я бы предложил воспользоваться регулярными выражениями и методом .str.replace() - на мой взгляд, это наиболее гибкий подход для данной задачи.

df = pd.DataFrame(
    {'COL1': [',,a1', ',a3', 'm100', 'w23'], 'COL2': [',a2', ',n1', ',k12', ','], 'COL3': ['a3', 'v4', '', 'y33'],
     'COL4': ['d1,', ',v8', 'w54,,,', 'e17']})

df.COL1 = df.COL1.str.replace('^,', '', regex=True)
df.COL4 = df.COL4.str.replace(',$', '', regex=True)
print(df)
   COL1  COL2 COL3   COL4
0   ,a1   ,a2   a3     d1
1    a3   ,n1   v4    ,v8
2  m100  ,k12       w54,,
3   w23     ,  y33    e17

В данном примере в столбце COL1 в первой и второй строке (по порядку) удалены по 1 запятой слева (в первой строке одна запятая осталась, т.к. их было 2). В столбце COL4 в первой и третьей строке (по порядку) удалено по 1 запятой справа. При необходимости удаления всех запятых слева или справа можно модифицировать регулярное выражение: '^,+' и ',+$'. А c помощью выражения ',+$|^,+' можно удалить любое количество запятых слева и справа. Можно также указать, какое количество запятых (или других символов) нужно удалить.

▲ 0

Вот так (пояснения в комментариях):

def del_commas(s):
    if s:  # если строка не пустая
        if s[0] == ',':  # если первый символ - запятая
            s = s[1:]  # вырезаем его
        if s[-1] == ',':  # аналогично для последнего символа
            s = s[:-1]
    return s  # возвращаем получившуюся строку


for col in df.columns:  # в каждом столбце ...
    df[col] = df[col].apply(del_commas)  # ... убрать запятые