Подтвердить что ты не робот

Как изменить тип данных фрейма данных 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" )?

4b9b3361

Ответ 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])