df.loc выдает ошибку, если dtype индекса смешанный int/str

У меня есть набор данных со смешанными значениями индекса, int и str, который df.to_csv читает как объект.

Если я попытаюсь нарезать строки, это не сработает, я получаю TypeError.

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

Я создал следующий тестовый пример:

import os
import pandas as pd
import numpy as np
#all str index
df1 = pd.DataFrame({'Col': [0, 20, 30, 10]}, index=['a', 'b','c','d'])
#all int index
df2 = pd.DataFrame({'Col': [0, 20, 30, 10]}, index=[1, 2, 3, 4])
#all str index with numbers
df3 = pd.DataFrame({'Col': [0, 20, 30, 10]}, index=['a', 'b', '3', '4'])
#mixed str/int
df4 = pd.DataFrame({'Col': [0, 20, 30, 10]}, index=['a', 'b', 3, 4 ])

df1.loc['b':'d']
    Col
b   20
c   30
d   10

df2.loc[2:4]
Col
2   20
3   30
4   10

df3.loc['b':'4']
Col
b   20
3   30
4   10

df4.loc['b':4]

TypeError

df4.index = df4.index.map(str)
df4.loc['b':'4']
Col
b   20
3   30
4   10

Почему слайс не работает для df4? Можете ли вы «исправить это» внутри фрагмента? Является ли изменение dtype индекса единственным вариантом?


person Martin S.    schedule 03.02.2020    source источник


Ответы (1)


изменение dtype индекса является единственным вариантом?

Нет, этого можно добиться с помощью get_loc, который находит позицию индекса метки, которую вы можете использовать в разделе iloc[]:

df4.iloc[df4.index.get_loc('b') : df4.index.get_loc(4)+1]

   Col
b   20
3   30
4   10
person anky    schedule 03.02.2020