Как изменить тип данных фрейма данных pandas на строку с определенным форматом?
Я начинаю срывать волосы с этим - так что я надеюсь, что кто-то может помочь. У меня есть pandas DataFrame, который был создан из электронной таблицы Excel с помощью openpyxl. Полученный DataFrame выглядит так:
print image_name_data
id image_name
0 1001 1001_mar2014_report
1 1002 1002_mar2014_report
2 1003 1003_mar2014_report
[3 rows x 2 columns]
... со следующими типами данных:
print image_name_data.dtypes
id float64
image_name object
dtype: object
Проблема в том, что числа в столбце id являются, по сути, идентификационными номерами, и мне нужно рассматривать их как строки. Я попытался преобразовать столбец id в строки, используя:
image_name_data['id'] = image_name_data['id'].astype('str')
Это кажется немного уродливым, но оно создает переменную типа "объект", а не "float64":
print image_name_data.dyptes
id object
image_name object
dtype: object
Однако созданные строки имеют десятичную точку, как показано:
print image_name_data
id image_name
0 1001.0 1001_mar2014_report
1 1002.0 1002_mar2014_report
2 1003.0 1003_mar2014_report
[3 rows x 2 columns]
Как преобразовать столбец float64 в pandas DataFrame в строку с заданным форматом (в данном случае, например, "% 10.0f" )?
Ответы
Ответ 1
Я не могу воспроизвести вашу проблему, но вы пытались сначала преобразовать ее в целое число?
image_name_data['id'] = image_name_data['id'].astype(int).astype('str')
Затем, что касается вашего более общего вопроса, вы можете использовать map
(как в этом ответе). В твоем случае:
image_name_data['id'] = image_name_data['id'].map('{:.0f}'.format)
Ответ 2
Если вы можете перезагрузить это, вы можете использовать аргумент dtypes.
pd.read_csv(..., dtype={'COL_NAME':'str'})
Ответ 3
Я помещаю это в новый ответ, потому что в комментариях нет строк/кодовых блоков.
Я предполагаю, что вы хотите, чтобы эти наны превратились в пустую строку? Я не мог найти хороший способ сделать это, только сделать уродливый метод:
s = pd.Series([1001.,1002.,None])
a = s.loc[s.isnull()].fillna('')
b = s.loc[s.notnull()].astype(int).astype(str)
result = pd.concat([a,b])