Определите типы Pandas столбцов DataFrame numpy массив значений DataFrame - PullRequest
2 голосов
/ 09 февраля 2020

Я пишу клейкий код, соединяющий библиотеки, которые используют Pandas DataFrames и Numpy массивы, и я сталкиваюсь с некоторыми проблемами, определяющими, какие столбцы являются 'объектами / строками' в Numpy массивах, которые изначально созданы из Pandas Dataframes.

import pandas as pd
test_df = pd.DataFrame({"a": [1, 2, 3], "b": ["one", "two", "three"]})
test_arr = test.values
test_df2 = pd.DataFrame(test_arr)

test_df.dtypes
# a     int64, b    object

test_df2.dtypes

# 0    object, 1    object

Я бы ожидал, что test_df2.dtypes будет int64 & object, а не обоим объектом.

Как найти типы данных исходных столбцов Pandas DataFrame, используя информацию в массиве numpy 'test_arr'?

Я могу добиться желаемого поведения, используя следующий подход, но Интересно, есть ли более эффективное / элегантное решение? Я также беспокоюсь, что этот подход может быть хрупким:

test_df3 = pd.DataFrame(test_arr).apply(
lambda x: pd.to_numeric(x, errors="ignore"), axis=1
)

EDIT - несколько решений, использующих типы данных test_df. У меня нет доступа к этому или контроля над созданием test_arr. Я хочу найти типы данных test_df, используя ТОЛЬКО test_arr.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2020

Вы можете создать словарь из test_df2 столбцов с test_df dtypes и использовать этот словарь в df.astype

d = dict(zip(test_df2.columns,[*test_df.dtypes]))
#{0: dtype('int64'), 1: dtype('O')}
final = test_df2.astype(dict(zip(test_df2.columns,[*test_df.dtypes])))

print(final.dtypes)
0     int64
1    object
dtype: object

есть еще один встроенный с именем infer_objects , который пытается вывести лучшие dtypes для столбцов объекта :

final1 = test_df2.astype(object).infer_objects()
print(final1.dtypes)

0     int64
1    object
dtype: object
1 голос
/ 09 февраля 2020

Вы можете сделать что-то подобное:

import pandas as pd
test_df = pd.DataFrame({"a": [1, 2, 3], "b": ["one", "two", "three"]})
test_arr = test_df.to_numpy()
test_df2 = pd.DataFrame(test_arr, columns = test_df.columns).astype(test_df.dtypes)

Обратите внимание, что в pandas документации лучше использовать .to_ numpy () вместо .values, как указано в этом pandas_docs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...