Я хотел бы добавить строку в начало каждого значения в указанном столбце фрейма данных pandas (элегантно). Я уже понял, как это сделать, и сейчас использую:
df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']
Это кажется чертовски неэлегантным делом - знаете ли вы какой-либо другой способ (который, возможно, также добавляет символ в строки, в которых этот столбец равен 0 или NaN)?
Если это пока неясно, хочу обратить внимание:
col
1 a
2 0
в:
col
1 stra
2 str0
!= False
бизнесом? Вы хотите добавитьstr
к каждой ценности или только к некоторым?df['col'] = 'str' + df['col'].astype(str)
?Ответы:
Пример:
источник
В качестве альтернативы вы также можете использовать
apply
комбинацию сformat
(или лучше с f-строками), которую я считаю немного более читаемой, если, например, кто-то также хочет добавить суффикс или манипулировать самим элементом:что также дает желаемый результат:
Если вы используете Python 3.6+, вы также можете использовать f-строки:
дающий тот же результат.
Версия с f-строкой почти так же быстро, как решение @ RomanPekar (python 3.6.4):
Используя
format
, однако, на самом деле гораздо медленнее:источник
format
действительно работает хуже. Как сравнивали?.apply
всегда либо так же быстро, либо медленнее, чем «прямые» векторизованные операции; даже если они не медленнее, я предпочитаю по возможности избегать их.x
собой и т.д., но это всего лишь дело вкуса ... :)Вы можете использовать pandas.Series.map:
Он будет применять слово "str" перед всеми вашими значениями.
источник
Если вы загружаете файл таблицы
dtype=str
или конвертируете тип столбца в строку,
df['a'] = df['a'].astype(str)
вы можете использовать такой подход:
Этот подход позволяет добавлять строки в начало, добавление и подмножество
df
.Работает на Pandas v0.23.4, v0.24.1. Не знаю о более ранних версиях.
источник
Другое решение с .loc:
Это не так быстро, как решения выше (> 1 мс на цикл медленнее), но может быть полезно в случае, если вам нужно условное изменение, например:
источник
.index
вdf[mask].index
?df.loc[mask]
работает, и работает, то.index
лишнее, правда?