предотвращение pandas.DataFrame.loc от приведения типов - PullRequest
1 голос
/ 10 октября 2019

Если мы инициализируем pandas.DataFrame, где типом будет int64:

import numpy as np
import pandas as pd 

df1 = pd.DataFrame(np.arange(4).reshape((2,2)), columns=['one','two'])

, а затем приведем тип первого столбца к np.str и посмотрим на вторую строку:

(1)

df2 = df1.astype({'one':np.str}) 
df2.loc[1,]

df2.loc[1,] возвращает pandas.Series с типом object, с сохранением типов элементов.

Однако, если мы приведем тип ко второму первому столбцубыть np.float

(2)

df3 = df1.astype({'one':np.float})
df3.loc[1,]             

df3.loc[1,] возвращает pandas.Series с типом float64, то есть int64 в столбце 'two' был повышен до float64.

Есть ли способ обеспечить, чтобы df.loc всегда сохранял тип, как в (1), избегать поведения в (2)?

(И зачем мне это? Потому что можно передавать целые числакак индексы, поплавки не могут, и меня немного раздражает необходимость переделывать объекты, потому что pandas решил, что то, что я хотел получить как возвращаемое значение, не то, что я изначально поместил в свой фрейм данных)

1 Ответ

0 голосов
/ 10 октября 2019

Когда вы объединяете целые и плавающие числа в серию, они выливаются как плавающие, как вы обнаружили. Одним из способов обойти это является установка dtype = object в вашем фрейме данных следующим образом:

import numpy as np
import pandas as pd 

df1 = pd.DataFrame(np.arange(4).reshape((2,2)), columns=['one','two'], dtype=object)

df2 = df1.astype({'one':np.str}) 
df2.loc[1,]

one    2
two    3
Name: 1, dtype: object

df3 = df1.astype({'one':np.float})
df3.loc[1,]

one    2
two    3
Name: 1, dtype: object

Ссылка

...