Панды переиндексируют фрейм данных с большим и меньшим индексом

#python #pandas #python-3.8

Вопрос:

У меня есть df1 фрейм данных в виде:

 idx Col1
2   v2
3   v3
4   v4
5   v5
 

Я хочу переиндексировать df1 для значений df1.reindex([1, 2, 3, 4, 5, 6]) , чтобы получить следующее:

 idx Col1
1   v2
2   v2
3   v3
4   v4
5   v5
6   v5
 

Где все значения меньше 2 получили значение индекса 2, все значения выше 5 получили значение индекса 5 из фрейма данных df1

Ответ №1:

Давайте попробуем заметить, что здесь я использую nearest с sorted

 out = df.reindex(sorted([1, 2, 3, 4, 5, 6]),method='nearest')
Out[105]: 
    Col1
idx     
1     v2
2     v2
3     v3
4     v4
5     v5
6     v5
 

Ответ №2:

Вы можете попробовать .ffill() .bfill() , как показано ниже:

 df1 = df1.reindex([1, 2, 3, 4, 5, 6]).ffill().bfill()
 

Ввод данных:

 df1 = pd.DataFrame({'Col1': {2: 'v2', 3: 'v3', 4: 'v4', 5: 'v5'}}).rename_axis(index='idx')

    Col1
idx     
2     v2
3     v3
4     v4
5     v5
 

Результат:

 print(df1)

    Col1
idx     
1     v2
2     v2
3     v3
4     v4
5     v5
6     v5

 

Редактировать:

В случае, если ваши индексы переиндексации не соответствуют друг другу, например [2, 1, 4, 6, 5, 3] , вы можете .sort_index() сначала .ffill() .bfill() и снова переиндексировать, как показано ниже:

 df1.reindex([2, 1, 4, 6, 5, 3]).sort_index().ffill().bfill().reindex([2, 1, 4, 6, 5, 3])
 

Результат:

     Col1
idx     
2     v2
1     v2
4     v4
6     v5
5     v5
3     v3
 

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

1. Это даст неправильный результат, если вы переиндексируете [2, 1, 4, 6, 5, 3] т. е. измените порядок элементов индекса, приведенный выше код не улавливает логику «больше 5» и «меньше 2».

2. @Zanam В этом случае вы можете использовать: df1.reindex([2, 1, 4, 6, 5, 3]).sort_index().ffill().bfill().reindex([2, 1, 4, 6, 5, 3])