В Python DataFrames, каковы правила автоматического преобразования типов при задании значений?

Если у меня есть датафрейм, который выглядит как

import pandas

d = pandas.DataFrame( data = {'col1':[100,101,102,103] } )
#   col1
#0   100
#1   101
#2   102
#3   103

и я делаю

d.set_value( 0,'col1', '200')

он преобразует '200' в целое число:

type( d.col1[0] )
#numpy.int64

Однако если я сделаю

d.set_value( 0,'col2', '200')

я получил

type( d.col2[0] )
#str

как и ожидалось.

Больше загадок:

Далее, скажи, что я делаю следующее

[ type(x) for x in d.col1 ]
#[numpy.int64, numpy.int64, numpy.int64, numpy.int64]
d.set_value( [0,1,2,3], 'col1', ['101', '102', '103', 200] )
[ type(x) for x in d.col1 ]
#[str, str, str, str]

Так что даже если d.col1 Первоначально был целочисленным столбцом, теперь он стал строковым столбцом. Каковы правила для такого приведения типов целых столбцов?

Мне просто любопытно, каковы правила автоматического приведения типов при манипулировании кадрами данных Pandas.

1 ответ

pandas является главным столбцом, и каждый элемент в одном и том же столбце должен иметь одинаковый тип данных.

Когда вы создаете фрейм данных, используя

import pandas as pd
df = pd.DataFrame({'col':[100,101,102,103]})
df.col.dtype

Out[11]:
dtype('int64')

Панды автоматически делают вывод, что все эти входные данные являются числовыми значениями и имеют целочисленный тип. Поэтому, когда вы устанавливаете значения для этого столбца colвсе ваши входные данные будут автоматически преобразованы в текущий столбец dtype который int64, поэтому следующее даст вам точно такой же вывод

df.set_value(0, 'col', '200')  # cast string into int
df.set_value(0, 'col', 200)  # int input
df.set_value(0, 'col', 200.1)  # cast float64 into int64

Но когда вы пытаетесь сделать df.set_value(0, 'col1', '200'), электрический ток df не имеет столбца col1Поэтому панды сначала создают новый столбец с именем col1, и он попытается вывести dtype для этого нового столбца на основе вашего ввода.

df.set_value(0, 'col1', '200')
df.col1.dtype  # dtype('O'), means object/string
df.set_value(0, 'col2', 200.1)
df.col2.dtype  # dtype('float64')
Другие вопросы по тегам