Создание DataFrame из dict & index order? - PullRequest
1 голос
/ 28 марта 2019

Я использую недавнюю загрузку Anaconda с Python 3.7.1 и pandas 0.23.4

pandas doc говорит:

Когда данные являются dict, а индекс не передан, индекс Series будет упорядочен в соответствии с порядком вставки dict

Я создаю экземпляр DataFrame от pandas без указания индекса:

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

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Такую же сортировку можно выполнить с помощью 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)),:]
1 голос
/ 28 марта 2019

Кажется, ошибка, для меня работа в Python 3.5, панды 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
0 голосов
/ 28 марта 2019

Похоже, pd.Series и pd.DataFrame имеют разные способы обработки кейса.

У меня похожая среда Python, и результат может быть воспроизведен на моем компьютере. Кроме того, случай Jezrel's pd.Series может быть воспроизведен на моем компьютере.

Я проверил руководство и обнаружил, что оба результата приведены ниже.

Для серии ключ index Когда данные являются диктом, а индекс не передан, индекс Series будет упорядочен в соответствии с порядком вставки dict , если вы используете версию Python> = 3.6 и Pandas версия> = 0,23.

Для фрейма данных: ключ - столбец. Если метки оси не пройдены, они будут построены из входных данных на основе правил здравого смысла .

Примечание. Когда данные являются dict, а столбцы не указаны, столбцы DataFrame будут упорядочены в соответствии с порядком вставки dict, если вы используете версию Python> = 3.6 и Pandas> = 0.23.

Это означает, что если вы хотите убедиться, что и столбцы, и индекс отсортированы, вам может понадобиться передать индекс или отсортировать их позже.

Надеюсь, это ответит на ваш вопрос.

...