convert_dtypes от Pandas не работает с числами, помеченными как объекты

#python #pandas #dataframe #types #type-conversion

#python #pandas #фрейм данных #типы #преобразование типов

Вопрос:

У меня есть фрейм данных pandas со столбцами Dtype object . Значения этих столбцов, очевидно, являются числами. Однако convert_dtypes не удается распознать типы чисел и object снова возвращается для всех столбцов. Вот некоторые результаты, которые могут проиллюстрировать проблему:

 my_df.convert_dtypes().info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3 entries, 0 to 2
Data columns (total 6 columns):
 #   Column        Non-Null Count  Dtype 
---  ------        --------------  ----- 
 0   A             3 non-null      object
 1   B             3 non-null      object
 2   C             3 non-null      object
 3   D             3 non-null      object
 4   E             3 non-null      object
 5   F             3 non-null      object
dtypes: object(6)
memory usage: 168.0  bytes
 

И это ячейки фрейма данных:

 my_df
    A   B   C   D   E   F
0   0   1   3   0   1   1
1   0   2   2   2   0   1
2   0   1   0   2   0   1
 

Хотя я могу конвертировать столбцы, используя другие методы (например to_numeric ,), я хочу иметь общий способ сделать это, поскольку входящие данные не всегда будут числовыми, и в этом случае string все будет в порядке.

Фрейм данных поступает из другой службы, поэтому дайте мне знать, если вам понадобится дополнительная информация об этом. Это причина to_numeric , по которой это не сработает. В принципе, мне нужно преобразовать типы в число, когда это возможно, и в строку в противном случае.

Версия Python 3.8.5 и версия pandas 1.1.2 .

Ответ №1:

Если логика преобразуется в числовую, если это возможно, используйте errors='ignore' параметр in to_numeric для возврата исходных значений столбца, если диалог не удался (это означает хотя бы одно нечисловое значение в столбце):

 print (df)
   A  B  C  D  E  F
0  0  1  3  0  1  a
1  0  2  d  s  0  s
2  0  1  0  s  0  d


df = df.apply(pd.to_numeric, errors='ignore')

print (df.dtypes)
A     int64
B     int64
C    object
D    object
E     int64
F    object
dtype: object
 

Комментарии:

1. На самом деле это должно сработать. Знаете ли вы, почему convert_dtypes это работает не так, как ожидалось?

2. @IvayloToskov — Понятия не имею, может быть, ошибка?