pandas dataframe: добавление и удаление префикса / суффикса из всех значений ячеек всего фрейма данных

чтобы добавить префикс / суффикс в фрейм данных, я обычно делаю следующее..

например, чтобы добавить суффикс '@',

df = df.astype(str) + '@'

это в основном дописывается '@' для всех значений ячеек.

Я хотел бы знать, как удалить этот суффикс. Есть ли способ, доступный с пандами.Класс DataFrame, который удаляет определенный символ префикса/суффикса из всего фрейма данных ?

Я пробовал перебирать строки (как серии) при использовании rstrip('@') следующим образом:

for index in range(df.shape[0]):
    row = df.iloc[index]
    row = row.str.rstrip('@')

теперь, чтобы сделать dataframe из этой серии,

new_df = pd.DataFrame(columns=list(df))
new_df = new_df.append(row)

однако это не работает. Дает пустой фрейм данных.

есть ли что-то действительно основное, чего мне не хватает?

3 ответов


вы можете использовать applymap для применения метода string к каждому элементу:

df = df.applymap(lambda x: str(x).rstrip('@'))

примечание: Я бы не ожидал, что это будет так же быстро, как векторизованный подход:pd.Series.str.rstrip т. е. преобразование каждого столбца отдельно


можно использовать apply и str.strip метод pd.Серия:

In [13]: df
Out[13]:
       a       b      c
0    dog   quick    the
1   lazy    lazy    fox
2  brown   quick    dog
3  quick     the   over
4  brown    over   lazy
5    fox   brown  quick
6  quick     fox    the
7    dog  jumped    the
8   lazy   brown    the
9    dog    lazy    the

In [14]: df = df + "@"

In [15]: df
Out[15]:
        a        b       c
0    dog@   quick@    the@
1   lazy@    lazy@    fox@
2  brown@   quick@    dog@
3  quick@     the@   over@
4  brown@    over@   lazy@
5    fox@   brown@  quick@
6  quick@     fox@    the@
7    dog@  jumped@    the@
8   lazy@   brown@    the@
9    dog@    lazy@    the@

In [16]: df = df.apply(lambda S:S.str.strip('@'))

In [17]: df
Out[17]:
       a       b      c
0    dog   quick    the
1   lazy    lazy    fox
2  brown   quick    dog
3  quick     the   over
4  brown    over   lazy
5    fox   brown  quick
6  quick     fox    the
7    dog  jumped    the
8   lazy   brown    the
9    dog    lazy    the

обратите внимание, что ваш подход не работает, потому что при выполнении следующего задания в вашем for-loop:

row = row.str.rstrip('@')

это просто присваивает результат row.str.strip на имя row без изменения DataFrame. Это то же самое поведение для всех объектов python и простое присвоение имени:

In [18]: rows = [[1,2,3],[4,5,6],[7,8,9]]

In [19]: print(rows)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [20]: for row in rows:
    ...:     row = ['look','at','me']
    ...:

In [21]: print(rows)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

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

In [22]: rows
Out[22]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [23]: for row in rows:
    ...:     row.append("LOOKATME")
    ...:

In [24]: rows
Out[24]: [[1, 2, 3, 'LOOKATME'], [4, 5, 6, 'LOOKATME'], [7, 8, 9, 'LOOKATME']]

обратите внимание, что назначение среза - это просто синтаксический сахар для метода мутатора:

In [26]: rows
Out[26]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [27]: for row in rows:
    ...:     row[:] = ['look','at','me']
    ...:
    ...:

In [28]: rows
Out[28]: [['look', 'at', 'me'], ['look', 'at', 'me'], ['look', 'at', 'me']]

это аналог pandas loc или iloc назначения на основе.


Вы можете сделать это очень легко и просто использовать панды.Фрейм данных.replace () метод для замены всех " @ "на"":

df.replace("@", "")

Если вы беспокоитесь о замене " @ " не только в конце ваших значений, вы можете использовать regex:

df.replace("@$", "", regex=True)