Преобразование столбца в строку для конкатенации

#python #pandas #string

#python #панды #строка

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом:

 Date        ID      Date_ID
1990-12-31  96187   1990-12-31 00:00:00_906187.0
  

Столбец «Date_ID» формируется путем объединения первых двух столбцов:

 df['Date_ID'] = df['Date'].map(str) "_"  df['ID'].map(str) 
  

Проблема, с которой я сталкиваюсь, заключается в том, что результат конкатенации заканчивается на «.0″…это означает, что он не соответствует другим частям моего кода. Я думал, что «.map (str)» исправит это, но это не так. Как я могу получить результат конкатенации, чтобы исключить «.0» из столбца «ID»?

Спасибо

Комментарии:

1. ваш ID столбец может иметь тип float , который вы получаете .0 при преобразовании в строку.

2. Как вы вообще получили эту идентификационную колонку? Это было из-за чтения какого-то файла csv? В этом случае может быть проще всего исправить операцию импорта для чтения в этом столбце в виде строки, чтобы предотвратить ненужный диалог с аргументом like dtypes={'ID': 'str'} .

3. Убедитесь, что ID всегда является целым числом (или строкой). В противном случае большие числа могут быть неточными, чего не должно быть для идентификатора.

4. Столбец ID взят из Excel. В Excel это сочетание типов чисел и текста. Когда он импортируется, он поступает как тип данных «объект». Когда я пытаюсь преобразовать его в .astype(«str»), столбец по-прежнему отображается как объект. Примечание: Сначала я обрабатываю данные импорта, чтобы сгенерировать свой столбец «ID».

Ответ №1:

Вместо .map(str) того, чтобы рассматривать возможность управления форматом, полученным при преобразовании карты, для соответствия остальной части вашего кода. Например, .map(lambda x: x.strftime("%Y-%m-%d") и / или .map(lambda x: str(int(x))) , что может привести к фрагменту, подобному:

 df['Date_ID'] = df['Date'].map(lambda x: x.strftime("%Y-%m-%d") "_"  df['ID'].map(lambda x: str(int(x))) 
  

Редактировать
Если вы не уверены, что x можно преобразовать в int, возможно, вы захотите продолжить и управлять форматированием идентификатора еще более комплексно, например, с помощью чего-то вроде:

 def format_id(x):
  if x is None:
    return "__your_choice__"
  elif math.isnan(x):
    return "__your_other_choice"
  elif isinstance(x, float):
    return f"{:.0f}"
  else:
    return

df['Date_ID'] = df['Date'].map(lambda x: x.strftime("%Y-%m-%d") "_"  df['ID'].map(format_id) 
  

Обратите внимание, что в целом, если вы можете избежать этого типа map / lambda, вы должны, потому что это исключает оптимизацию pandas, которая была бы доступна, если бы вы могли, например, использовать .astype(str)

Комментарии:

1. Привет, Джеймс. Спасибо, что вернулись ко мне. Столбец ID имеет dtype «Объект». Я попробовал ваш метод lamda, и я получил сообщение об ошибке «невозможно преобразовать float NaN в целое число». Удаление части кода int (x) дает мне тот же ответ, что и раньше — т.Е. Данные заканчиваются «.0»