Значения из словаря в таблицу Excel

Значения из словаря в таблицу Excel

Значения из словаря в таблицу Excel

Значения из словаря в таблицу Excel

У меня 134 узла. Было выполнено четырнадцать различных анализов (прогонов). Каждый прогон имеет значения, сохраненные в виде словаря для всех 134 узлов. Каждый узел имеет значения, сохраненные для 150 временных шагов (150 значений для каждого узла). Например, запуск 1 сохраняется как словарь (10 временных шагов), то есть узел A, (0,1,0,5,6, 7, 8, 1, 0,6) и узел B, (1,2,3,4,5,7, 6, 8,9,1). Аналогичным образом Run 2 сохраняется как словарь. Я мог бы экспортировать эти значения на лист Excel, но значения сохраняются вместе как (0,1,0,5,6, 7, 8, 1, 0,6). Я хочу, чтобы только первые три значения для каждого узла были экспортированы в лист Excel в трех отдельных столбцах (вместо всех 10 значений)

Как экспортировать отдельные значения в каждом столбце из прогонов 1 и 2 и сохранить их на листе Excel?

Код, который сохраняет таблицу Excel со всеми значениями, перечисленными в одном столбце:

run1, run2, run3, run4, run5, run6, run7, run8, run9, run10, run11, run12, run13, run14 = data # each run has 5 values for 2 variables
 df = pd.DataFrame.from_dict(data)
 df.to_excel("data.xlsx")

Когда я запускаю этот код, df_1= df.loc[:, pd.IndexSlice[:, ['Value 1', 'Value 3', 'Value 5']]]

Получила следующую ошибку:

TypeError                                 Traceback (most recent call last)
<ipython-input-84-8d2d90289161> in <module>()
----> 1 df_1= df.loc[:, pd.IndexSlice[:, ['Value 1', 'Value 3', 'Value 5']]]

/home/MBIAL/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/core/indexing.py in __getitem__(self, key)
   1308 
   1309         if type(key) is tuple:
-> 1310             return self._getitem_tuple(key)
   1311         else:
   1312             return self._getitem_axis(key, axis=0)

/home/MBIAL/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/core/indexing.py in _getitem_tuple(self, tup)
    794     def _getitem_tuple(self, tup):
    795         try:
--> 796             return self._getitem_lowerdim(tup)
    797         except IndexingError:
    798             pass

/home/MBIAL/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/core/indexing.py in _getitem_lowerdim(self, tup)
    920         for i, key in enumerate(tup):
    921             if is_label_like(key) or isinstance(key, tuple):
--> 922                 section = self._getitem_axis(key, axis=i)
    923 
    924                 # we have yielded a scalar ?

/home/MBIAL/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/core/indexing.py in _getitem_axis(self, key, axis)
   1470                     raise ValueError('Cannot index with multidimensional key')
   1471 
-> 1472                 return self._getitem_iterable(key, axis=axis)
   1473 
   1474             # nested tuple slicing

/home/MBIAL/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/core/indexing.py in _getitem_iterable(self, key, axis)
   1034     def _getitem_iterable(self, key, axis=0):
   1035         if self._should_validate_iterable(axis):
-> 1036             self._has_valid_type(key, axis)
   1037 
   1038         labels = self.obj._get_axis(axis)

/home/MBIAL/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/core/indexing.py in _has_valid_type(self, key, axis)
   1390 
   1391             # TODO: don't check the entire key unless necessary
-> 1392             if len(key) and np.all(ax.get_indexer_for(key) < 0):
   1393 
   1394                 raise KeyError("None of [%s] are in the [%s]" %

/home/MBIAL/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/indexes/base.py in get_indexer_for(self, target, **kwargs)
   2384         """ guaranteed return of an indexer even when non-unique """
   2385         if self.is_unique:
-> 2386             return self.get_indexer(target, **kwargs)
   2387         indexer, _ = self.get_indexer_non_unique(target, **kwargs)
   2388         return indexer

/home/MBIAL/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/pandas/indexes/base.py in get_indexer(self, target, method, limit, tolerance)
   2284                                  'backfill or nearest reindexing')
   2285 
-> 2286             indexer = self._engine.get_indexer(target._values)
   2287 
   2288         return _ensure_platform_int(indexer)

pandas/index.pyx in pandas.index.IndexEngine.get_indexer (pandas/index.c:6077)()

pandas/src/hashtable_class_helper.pxi in pandas.hashtable.PyObjectHashTable.lookup (pandas/hashtable.c:14050)()

TypeError: unhashable type 

Спасибо

Прия

Пожалуйста, обновите свой вопрос для ясности. В первую очередь две вещи: 1) вы говорите, что хотите экспортировать значение 1,3,6 из каждого столбца, но в ваших столбцах есть только списки с 5 значениями и 2) заголовок вашего вопроса должен резюмировать вашу проблему, как она есть сейчас слишком широкий. По сути, вы хотите сначала разделить столбец, содержащий список, на несколько столбцов, а затем выбрать определенные столбцы для экспорта в Excel. Это две разные проблемы.

user3471881 23.11.2018 10:30

Вы пробуете мое решение? Если да, то есть какая-то проблема?

jezrael 24.11.2018 13:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
263
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это сработает:

  1. Разделите свой список значений в столбце на несколько столбцов следующим образом:

    df[['Value1','Value2','Value3','Value4','Value5','Value6']] = pd.DataFrame(df.A.values.tolist(), index= df.index)

  2. Выберите нужные столбцы:

    df = df[['Value1','Value3','Value6']]

  3. Написать в csv

    import pandas as pd

    df.to_csv("Output.csv")

@ Рахул Агарвал. Спасибо. Я пробовал ваш код, но все равно не смог сохранить каждое значение в отдельном столбце. Найдите код, который я использовал в вопросе выше.

Priya 24.11.2018 06:00

Хорошо, что ваша проблема решена, но мой код и ваш код похожи !!

Rahul Agarwal 24.11.2018 07:51

@ Рахул Агарвал. Нет, я пробовал ваш код, который я опубликовал в предыдущем вопросе. У меня не получилось. Я все еще ищу ответы

Priya 24.11.2018 08:27

Какую ошибку или проблему вызывает мой код?

Rahul Agarwal 24.11.2018 08:50

@ Рахул Агарвал. Код не вызывал никаких ошибок, я не сохранил ни одного листа Excel. Но когда я использовал измененный код (см. Вопрос выше), я получил лист Excel, но со списком всех 5 значений, сохраненных в одном столбце, а не в 5 столбцах. Кроме того, я не знаю, как сохранить только 3 значения вместо всех 5 значений.

Priya 24.11.2018 09:07

тогда перед сохранением проверьте, что в df? Кроме того, попробуйте создавать новый df на каждом этапе, чтобы вы знали, где ошибка, а какая часть точно не работает.

Rahul Agarwal 24.11.2018 09:51

@ Рахул Агравал. Пожалуйста, найдите прикрепленное изображение листа Excel. Для 14 прогонов каждая переменная хранит здесь 150 значений. Я могу достичь только этого шага, я не знаю, что делать дальше

Priya 24.11.2018 10:39

Итак, я предполагаю, что это ваше первоклассное мастерство !! Теперь прочтите этот Excel в df от pd.read_excel("name.xlsx, sheename =0), а затем столбец за столбцом запустите код. А затем сохраните df в новый xlsx

Rahul Agarwal 24.11.2018 10:47

Пожалуйста, найдите измененный код в вопросе. Я пытался, как вы предлагали, но все еще не работал. Нужно ли что-то включать в код?

Priya 24.11.2018 13:45

@jezrael. Я попробовал ваш код, как вы его дали. Извините, я не очень хорошо знаю Python. Стоит ли упоминать имя файла где-нибудь в вашем коде?

Priya 24.11.2018 15:32

Все еще сталкиваешься с проблемами ... Я думаю, ты не очень хорошо справляешься с тем, чтобы сказать, с какой проблемой ты столкнулся ...

Rahul Agarwal 25.11.2018 13:18

@ Рахул Агарвал. Я снова переформулировал вопрос, чтобы было понятнее.

Priya 26.11.2018 17:23

@ jezrael и Рахул Агарвал. Найдите отредактированный вопрос со скриншотами. Все еще ищу ответ. Спасибо

Priya 28.11.2018 17:13

Прия ... позвольте мне повторить ... есть Excel, как показано, где у вас есть один столбец с именем ACTB, в котором у вас есть 10 значений. Из этих 10 значений вам нужно 3 значения. И это нужно сделать для всех столбцов в опубликованном вами Excel !! Поправьте меня, если я ошибаюсь в понимании проблемы

Rahul Agarwal 28.11.2018 20:50

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

Priya 29.11.2018 05:12

А теперь ... Вы читали этот excel / csv to python с помощью функции pandas.to_csv? Если да, то выглядит ли pandas df в точности как ваш excel или нет?

Rahul Agarwal 29.11.2018 06:55

@ Рахул Агарвал. Да, в фрейме данных pandas данные выглядели точно так же, как показано в таблице Excel. Да, я прочитал данные из python в функцию csv

Priya 29.11.2018 07:51

Хорошо .. Итак, теперь в вашем df, если вы примените код jezreal ... где и какую ошибку вы получите? Я иду постепенно и медленно ... так что мы наконец-то сможем решить вашу проблему

Rahul Agarwal 29.11.2018 08:11

@ Рахул Агарвал. Я включил код, предоставленный jezreal, под кодом, чтобы сохранить df в Excel. Когда я запускаю код, он не вызывает ошибку и не сохраняет лист Excel.

Priya 29.11.2018 08:37

не сохраняйте напрямую, идите шаг за шагом .. после каждого шага проверяйте, движется ли он к вашему решению ... пробуйте print(df) после каждого шага и проверяйте !! Не проверяйте Excel напрямую

Rahul Agarwal 29.11.2018 08:45

Да, я мог запустить код jezreal, но он выдал ошибку, которую я опубликовал в вопросе. Но лист Excel был сохранен только для узла ACTB, и на этот раз все 150 значений были показаны в отдельном столбце. Но мне просто нужно сохранить только значение 1, значение 75 и значение 150 для всех 134 узлов.

Priya 29.11.2018 10:45

Это вызвало ошибку. Bcoz Я помню, что в вашем предыдущем вопросе в качестве имен столбцов было "Value1" и т.д. и т.д., которых сейчас нет? Итак, вам нужно изменить код в соответствии с вопросом, который вы задали тогда. Тем не менее, если у вас есть df узла ACTB со 150 столбцами, вам просто нужно выбрать нужный столбец, как показано в «Шаге 2» моего ответа. Чтобы запустить этот код для всех столбцов, просто используйте цикл или примените функцию, и все готово !!

Rahul Agarwal 29.11.2018 10:51

@ Рахул Агарвал. Огромное спасибо. Я мог бы использовать цикл for и получить значения для всех 134 переменных. У меня нет заголовка для значений, просто для понимания я разместил порядок значений, который меня интересовал. Можно ли брать только определенные значения ?.

Priya 29.11.2018 11:09

Позвольте нам продолжить обсуждение в чате.

Rahul Agarwal 29.11.2018 11:15
Ответ принят как подходящий

Используйте понимание словаря с помощью concat, а затем отфильтруйте MultiIndex в столбцах по слайсеры:

#python 3.6 +
f = lambda x: f'Value {x + 1}'
#python bellow 3.6
#f = lambda x: 'Value {}'.format(x + 1)
d = {x: pd.DataFrame(df[x].values.tolist(), index=df.index).rename(columns=f) 
        for x in df.columns}
df = pd.concat(d, axis=1)

df = df.loc[:, pd.IndexSlice[:, ['Value 1','Value 3','Value 5']]]
print (df)
            A                       B                
      Value 1 Value 3 Value 5 Value 1 Value 3 Value 5
Run 1       0       0       6       1       3       5
Run 2       0       0       1       1       3       0

df.to_excel(file)

Поскольку у меня нет заголовка для значений, я нашел местоположение значения для интересующего меня узла, используя приведенный ниже код:

df_1 = df_1.iloc [:, [узел 1]]

Когда вы запускаете этот код, он дает начальное и конечное местоположение узла 1. Поэтому я указал эту строку в приведенном выше коде, предоставленном jezrael, и сохранил свои результаты на листе Excel.

Заменил эту строку ниже в коде Jezrael на строку выше:

df = df.loc [:, pd.IndexSlice [:, ['Значение 1', 'Значение 3', 'Значение 5']]]

@jezrael и Rahul Agarwal Спасибо за вашу помощь

Другие вопросы по теме