Как построить каждые десять кадров данных в словаре ? Панды питонов

#python #pandas #dataframe #dictionary

#питон #панды #фрейм данных #словарь

Вопрос:

У меня есть словарь из 100 кадров данных, и я хотел бы отображать только каждые десять кадров данных. Я пробовал это, но у меня есть эта ошибка:

 keys = dfs.keys() #keys = dict_keys([1,2,...,100])  # iterate through the dataframe dictionary keys and use enumerate for idx, key in range(0,len(keys),10): lt;----------  dfs[key]['Value'].plot(ax=ax_array[idx], title=f'DataFrame: {key}') plt.tight_layout()  TypeError: cannot unpack non-iterable int object  

Я знаю, что проблема заключается в определении самого цикла for. Но я хотел бы построить сюжет :

 dfs[1], dfs[10], dfs[20],...,dfs[100]  

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

1. idx, key in range(0,len(keys),10) диапазон выводит одно число. вы ожидаете, что он распакуется на два значения

2. Это keys а dict ?

3. Можете ли вы показать, где keys определено

Ответ №1:

Воспользуйся

 for idx, (key, df) in enumerate(dfs.items()):  df['Value'].plot(ax=ax_array[idx], title=f"DataFrame: {key})  

Это автоматически использует ключи и значения dfs и с enumerate помощью которых вы также получаете индекс цикла. Просто не забудьте сгруппировать вещи соответствующим образом: переменная цикла на самом деле представляет собой кортеж индекса и кортеж ключ-значение, то есть (idx, (key, value)) , где вы можете оставить внешние скобки , и я value заменил df их для ясности.


На самом деле вы хотите просмотреть все x элементов, для чего на самом деле не стоит использовать словарь. Поэтому вам было бы лучше просто поместить все ваши фреймы данных в список. Тогда вышеперечисленное стало бы:

 for idx, df in enumerate(dfs[::10]):  df['Value'].plot(ax=ax_array[idx], title=f"DataFrame: {idx 1})  

который отображает каждый 10-й кадр данных.

Обратите "... {idx 1}" внимание на то , что я добавил, так как ваш вопрос указывает на то, что вы предпочитаете нумерацию на основе 1 для идентификатора фрейма данных (что имеет смысл, поскольку он выводится для людей) и idx основан на 0.


Теперь перейдем к вашей актуальной проблеме и ответу:

 keys = sorted(dfs) for idx, key in enumerate(keys[::10]):  dfs[key]['Value'].plot(ax=ax_array[idx], title=f"DataFrame: {key 1})  

Вы видите, что здесь dfs[key] к этому нужно обращаться отдельно, так как мы не можем проходить через элементы каждого n-го элемента (как описано выше).

Обратите внимание, что я добавил sorted() . Вы можете не хотеть или не нуждаться в этом. Более новые версии (C)Python сохраняют порядок вставки, поэтому без него ваши фреймы данных будут отображаться так, как они были добавлены.

Также обратите внимание, что сортировка по словарю напрямую означает сортировку по его ключам (это относится ко всему, что повторяется по словарю: оно неявно повторяется по его ключам).

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

1. но как вы справляетесь с сюжетом каждые десять кадров данных ? (график dfs[1], dfs[10], dfs[20],…)

2. Ах, верно, это ускользнуло от меня. Вероятно, потому, что со словарем вы на самом деле не имеете дело с «каждым x элементов», поскольку элементы не пронумерованы (или упорядочены. Технически это так, но не с теоретической или даже с точки зрения использования).

3. @ThonyNadhir Я расширил свой ответ, включив фактор шага, с добавлением о том, почему диктант с (упорядоченными) целыми числами на самом деле не является лучшей отправной точкой (он имеет свое применение, но не здесь).