#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])