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)