df.lo c выдает ошибку, если d-тип индекса смешан int / str - PullRequest
2 голосов
/ 03 февраля 2020

У меня есть набор данных со смешанными значениями индекса, 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? Можете ли вы «исправить это» внутри среза? Является ли изменение типа d индекса единственным вариантом?

1 Ответ

1 голос
/ 03 февраля 2020

меняет dtype индекса единственная опция?

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

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

   Col
b   20
3   30
4   10
...