#pandas #dictionary #python-3.7
#pandas #словарь #python-3.7
Вопрос:
Я использую недавно загруженную Anaconda с Python 3.7.1 и pandas 0.23.4
В документе pandas говорится:
Когда данные являются dict, а индекс не передается, индекс серии будет упорядочен в соответствии с порядком вставки dict
Я создаю экземпляр фрейма данных pandas из dict без переданного индекса:
newspapers = {'Jim':{'Mon':15,'Tue':17,'Wed':21,'Thu':16,'Fri':19},
'Tony':{'Mon':8,'Tue':15,'Wed':11,'Thu':16,'Fri':13},
'Colin':{'Mon':13,'Tue':17,'Wed':19,'Thu':17,'Fri':20}
}
newspapers_df = pd.DataFrame(newspapers)
Почему это не отображается в порядке вставки, Пн, вт, Ср, чт, Пт?:
print(newspapers_df)
выводит:
Jim Tony Colin
Fri 19 13 20
Mon 15 8 13
Thu 16 16 17
Tue 17 15 17
Wed 21 11 19
Комментарии:
1. Какова ваша версия pandas, поскольку это поведение было введено для конкретной версии
2. Вам следует исправлять ошибки на github , поскольку там это более уместно
3. Обновлено сообщение для версии 0.23.4. Я не был уверен, что нашел ошибку, я думал, что чего-то не хватает
4. Для меня это выглядит как ошибка, я бы опубликовал проблему, поскольку она должна работать
5. Честно говоря, я не думаю, что мне это нужно. Для меня это ошибка, есть много обходных путей, но реальный вопрос в том, почему это не работает
Ответ №1:
Кажется, ошибка, для меня, работающего на python 3.5, pandas 0.24.2 создает Series
в понимании словаря и передает в DataFrame
конструктор:
newspapers_df = pd.DataFrame({k:pd.Series(v) for k, v in newspapers.items()})
print (newspapers_df)
Jim Tony Colin
Mon 15 8 13
Tue 17 15 17
Wed 21 11 19
Thu 16 16 17
Fri 19 13 20
Возможные решения для ваших данных — DataFrame.reindex
или ordered CategoricalIndex
:
newspapers_df = pd.DataFrame(newspapers)
L = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
newspapers_df = newspapers_df.reindex(L)
Или:
newspapers_df.index = pd.CategoricalIndex(newspapers_df.index, ordered=True, categories=L)
newspapers_df = newspapers_df.sort_index()
print (newspapers_df)
Jim Tony Colin
Mon 15 8 13
Tue 17 15 17
Wed 21 11 19
Thu 16 16 17
Fri 19 13 20
Комментарии:
1. Да, сортировка, передача индекса отлично работает, спасибо, но вопрос был не в этом
2. @boardtc — да, значит, первый абзац работает? Я думаю, что только внешний элементарный процесс обрабатывается правильно, более глубокий — нет.
3. newspapers_df в вашем первом абзаце печатается так, как вы показываете, и для меня тоже. Я могу вызвать ошибку на pandas-dev guthub.
4. github.com/pandas-dev/pandas/issues/25911 открыт, но сообщество не пожелало исправлять
Ответ №2:
Такую же сортировку можно выполнить с помощью numpy.argsort():
days_dict = {'Mon':0, 'Tue':1,'Wed':2,'Thu':3,'Fri':4,'Sat':5,'Sun':6}
df = pd.DataFrame(newspapers).reset_index()
df.iloc[np.argsort(df['index'].map(days_dict)),:]
Ответ №3:
Похоже, что pd.Series и pd.DataFrame имеют разные способы обработки обращения.
У меня похожая среда python, и результат может быть воспроизведен на моем компьютере. Кроме того, случай Jezrel’s pd.Series может быть воспроизведен на моем компьютере.
Я проверил руководство и обнаружил, что оба результата следуют за документом.
Для series ключом является index. Когда данные являются dict, а индекс не передается, индекс серии будет упорядочен в соответствии с порядком вставки dict, если вы используете версию Python >= 3.6 и версию Pandas >= 0.23.
Для фрейма данных: ключом является столбец. Если метки осей не переданы, они будут созданы из входных данных на основе правил здравого смысла.
Обратите внимание, что Если данные представляют собой dict, а столбцы не указаны, то столбцы фрейма данных будут упорядочены в соответствии с порядком вставки dict, если вы используете версию Python >= 3.6 и Pandas >= 0.23.
Это означает, что если вы хотите убедиться, что сортируются оба столбца и индекс, вам может потребоваться передать индекс или отсортировать их позже.
Надеюсь, это ответит на ваш вопрос.
Комментарии:
1. Ответ заключался в том, что в pandas есть ошибка!