Панда однорядная индексация без приведения - PullRequest
0 голосов
/ 06 ноября 2018

Индексирование единственной строки в DataFrame Pandas, содержащей объекты (строки), возвращает серию типа объекта.

df1 = pd.DataFrame({'a': np.arange(3), 'b': np.arange(0.5,3),'c': list('def')})

df1
   a    b  c
0  0  0.5  d
1  1  1.5  e
2  2  2.5  f

df1.loc[0]
a      0
b    0.5
c      d
Name: 0, dtype: object

Индексирование отдельной строки в DataFrame Pandas, не содержащей объектов (строк), возвращает серию, которая преобразует свои значения. Столбец a имеет тип int64 в кадре данных. Результирующий ряд содержит значение столбца a как float64.

df2 = pd.DataFrame({'a': np.arange(3), 'b': np.arange(0.5,3)})

df2
  a    b
0  0  0.5
1  1  1.5
2  2  2.5

df2.loc[0]

a    0.0
b    0.5
Name: 0, dtype: float64

Это поведение не кажется последовательным, не так ли? Как я могу выбрать одну строку второго DataFrame df2, не переводя мои целые числа в числа с плавающей точкой?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Обходное решение, согласно ссылке на stackoverflow, размещенной в комментариях @Michael:

desired_index = 3

df.astype('O').iloc[desired_index]

Мой фрейм данных большой, и преобразование всего фрейма данных в объект занимает некоторое время. Вот более быстрое, но более сложное решение.

df.iloc[[desired_index]].astype('O').iloc[0]
0 голосов
/ 06 ноября 2018

Когда в Series имеется более одного type, панды будут использовать object для его обработки. Если это float и int, он изменит int на float

df1.loc[0].map(type)
Out[6]: 
a      <class 'numpy.int32'>
b    <class 'numpy.float64'>
c              <class 'str'>
Name: 0, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...