#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»