У меня есть следующий DataFrame из запроса SQL:
(Pdb) pp total_rows
ColumnID RespondentCount
0 -1 2
1 3030096843 1
2 3030096845 1
и я хочу повернуть это так:
total_data = total_rows.pivot_table(cols=['ColumnID'])
(Pdb) pp total_data
ColumnID -1 3030096843 3030096845
RespondentCount 2 1 1
[1 rows x 3 columns]
total_rows.pivot_table(cols=['ColumnID']).to_dict('records')[0]
{3030096843: 1, 3030096845: 1, -1: 2}
но я хочу убедиться, что 303 столбцы приводятся в виде строк вместо целых чисел, чтобы я получил это:
{'3030096843': 1, '3030096845': 1, -1: 2}
astype("string")
а неastype(str)
по каким-то довольно веским причинам, взгляните.Ответы:
Один из способов преобразования в строку - использовать astype :
Однако, возможно, вы ищете
to_json
функцию, которая преобразует ключи в действительный json (и, следовательно, ваши ключи в строки):Примечание: вы можете передать в буфер / файл, чтобы сохранить его, наряду с некоторыми другими параметрами ...
источник
to_json()
вероятно, не вызывает,astype(str)
поскольку он оставляет datetime64 и его подклассы в миллисекундах с эпохи.Если вам нужно преобразовать ВСЕ столбцы в строки, вы можете просто использовать:
Это полезно, если вам нужно, чтобы все, кроме нескольких столбцов, были строками / объектами, а затем вернитесь и преобразуйте остальные во все, что вам нужно (в данном случае целое число):
источник
Вот еще один, особенно полезный для преобразования нескольких столбцов в строку вместо одного столбца:
источник
Используйте .astype (str)
Пример:
Позвольте d быть Фреймом Данных Панд
d['Column_name'].astype(str)
источник
панды> = 1.0: пора прекратить использовать
astype(str)
!До pandas 1.0 (ну, на самом деле, 0.25) это был дефактный способ объявления серии / столбца в виде строки:
Начиная с версии 1.0, рассмотрите возможность использования
"string"
типа .Вот почему, как цитируют документы:
Смотрите также раздел о поведенческих различиях между
"string"
иobject
.Типы расширений (введенные в 0.24 и формализованные в 1.0) ближе к пандам, чем numpy, что хорошо, потому что numpy типы недостаточно мощны. Например, NumPy не имеет никакого способа представления отсутствующих данных в целочисленных данных (поскольку
type(NaN) == float
). Но панды могут использовать Nullable Integer столбцы .Почему я должен прекратить его использовать?
Случайное смешивание dtypes
. Первая причина, как указано в документации, заключается в том, что вы можете случайно сохранить нетекстовые данные в столбцах объекта.
Сложность в различении строк и других объектов Python
Другой очевидный пример - сложнее различить «строки» и «объекты». Объекты по сути являются типом бланкет для любого типа, который не поддерживает векторизованные операции.
Рассматривать,
До панд 0,25 практически не было возможности различить, что «А» и «В» не имеют данных одного типа.
Начиная с pandas 1.0, это становится намного проще:
Читаемость
Это говорит само за себя ;-)
Хорошо, я должен прекратить использовать это прямо сейчас?
... Нет. На момент написания этого ответа (версия 1.1) преимуществ производительности не было, но в документах ожидается, что будущие усовершенствования значительно повысят производительность и уменьшат использование памяти для
"string"
столбцов, а не для объектов. С учетом сказанного, однако, никогда не рано формировать хорошие привычки!источник
Использование
.apply()
сlambda
функцией преобразования также работает в этом случае:total_rows['ColumnID'] = total_rows['ColumnID'].apply(lambda x: str(x))
Для целых фреймов данных вы можете использовать
.applymap()
. (но в любом случае, вероятно.astype()
, быстрее)источник