Создайте смешанный тип данных Pandas с использованием массива numpy типа "объект" - PullRequest
2 голосов
/ 21 апреля 2020

У меня есть pandas Dataframe со смешанными типами данных (float64 и строки), чтобы использовать его в конвейере sklearn Мне нужно преобразовать его в массив numpy. В конце конвейера я хочу снова создать Dataframe.

Проблема заключается в том, что при создании массива numpy со смешанными типами все данные преобразуются в d-тип "объект". Таким образом, когда я создаю новый кадр данных в конце, все данные являются категориальными.

Пример:

Кадр данных со смешанными данными

>>> dataframe = pd.DataFrame([[1,2,3],["a","b","c"]], columns = ["num", "cat"])

>>> dataframe.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   num     3 non-null      int64 
 1   cat     3 non-null      object
dtypes: int64(1), object(1)
memory usage: 176.0+ bytes

К numpy массиву

>>> array = dataframe.to_numpy()

array([[1, 'a'],
       [2, 'b'],
       [3, 'c']], dtype=object)

Назад к фрейму данных

>>> new_df = pd.DataFrame(array, columns = ["num", "cat"])

>>> new_df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   num     3 non-null      object
 1   cat     3 non-null      object
dtypes: object(2)
memory usage: 176.0+ bytes

Теперь два столбца являются категориальными.

Есть ли способ заставить pandas распознавать истинные типы данных в массиве numpy?

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Вы также можете использовать infer_objects():

new_df = pd.DataFrame(array, columns = ["num", "cat"]).infer_objects()
print(new_df,'\n\n',new_df.dtypes)

  num cat
0    1   a
1    2   b
2    3   c 

num     int64
cat    object
dtype: object
1 голос
/ 21 апреля 2020

Если вы используете pandas> = 1,0, есть convert_dtypes:

>>> new_df = pd.DataFrame(array, columns = ["num", "cat"]).convert_dtypes()
>>> new_df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   num     3 non-null      Int64 
 1   cat     3 non-null      string
dtypes: Int64(1), string(1)
memory usage: 179.0 bytes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...