Панды преобразуют типы данных в зависимости от того, получаете ли вы строку, затем столбец или наоборот

#python #pandas

#питон #панды

Вопрос:

Я просто столкнулся с этим странным поведением у Панд и надеялся, что кто-нибудь сможет пролить на это некоторый свет. У меня есть фрейм данных с двумя столбцами, один из которых имеет целочисленный тип, а другой-с плавающей запятой. Затем я хочу получить значения из первой строки, первого столбца. Есть два способа сделать это: либо сначала запросить первую строку .iloc[0] , а затем получить запрошенный столбец ['X'] , либо сначала получить столбец, а затем первую строку этого. Первый (первая строка) изменит тип данных значения с int на float (нежелательное поведение), но первый столбец сохранит тип данных. Это ошибка, или я упускаю какие-то нюансы Панд?

Вот пример кода для воспроизведения поведения

 import numpy as np import pandas as pd print(np.__version__, pd.__version__, 'n')  # Create two data sets, one that is integer and one that is floating point.  data1 = np.arange(1, 5, dtype=int) data2 = np.arange(2, 6, dtype=float) df = pd.DataFrame(data={'X': data1, 'Y': data2})  # Verify the data types in the dataframe  print(df.dtypes, 'n')  # Get the column first, then the row. We get the expected integer type  print('Column first: ', type(df['X'].iloc[0]))  # Get the row first, then the column. we get a float instead of integer.  print('Row first: ', type(df.iloc[0]['X']))  

с результирующим выводом в моей системе

 1.21.2 1.3.4   X int32 Y float64 dtype: object   Column first: lt;class 'numpy.int32'gt; Row first: lt;class 'numpy.float64'gt;  

Ответ №1:

Ряд имеет уникальный тип, сначала разрезая строку, вы возвращаете ряд строки, и значения вводятся с плавающей точкой, как и во втором столбце. Значение int отображается как плавающее. Такое поведение также происходит при вставке NaN в серию int.

Сначала разрезав столбец, вы сохраняете тип int.

Тем не менее, есть третий способ получить то, что вы хотите: нарежьте оба сразу

 df.iloc[0,0]  

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

1. Идеальный. Я не оценил, что первый фрагмент транслировался в соответствии с типами в новой временной серии.