У меня 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
Спасибо
Прия
Вы пробуете мое решение? Если да, то есть какая-то проблема?






Это сработает:
Разделите свой список значений в столбце на несколько столбцов следующим образом:
df[['Value1','Value2','Value3','Value4','Value5','Value6']] = pd.DataFrame(df.A.values.tolist(), index= df.index)
Выберите нужные столбцы:
df = df[['Value1','Value3','Value6']]
Написать в csv
import pandas as pd
df.to_csv("Output.csv")
@ Рахул Агарвал. Спасибо. Я пробовал ваш код, но все равно не смог сохранить каждое значение в отдельном столбце. Найдите код, который я использовал в вопросе выше.
Хорошо, что ваша проблема решена, но мой код и ваш код похожи !!
@ Рахул Агарвал. Нет, я пробовал ваш код, который я опубликовал в предыдущем вопросе. У меня не получилось. Я все еще ищу ответы
Какую ошибку или проблему вызывает мой код?
@ Рахул Агарвал. Код не вызывал никаких ошибок, я не сохранил ни одного листа Excel. Но когда я использовал измененный код (см. Вопрос выше), я получил лист Excel, но со списком всех 5 значений, сохраненных в одном столбце, а не в 5 столбцах. Кроме того, я не знаю, как сохранить только 3 значения вместо всех 5 значений.
тогда перед сохранением проверьте, что в df? Кроме того, попробуйте создавать новый df на каждом этапе, чтобы вы знали, где ошибка, а какая часть точно не работает.
@ Рахул Агравал. Пожалуйста, найдите прикрепленное изображение листа Excel. Для 14 прогонов каждая переменная хранит здесь 150 значений. Я могу достичь только этого шага, я не знаю, что делать дальше
Итак, я предполагаю, что это ваше первоклассное мастерство !! Теперь прочтите этот Excel в df от pd.read_excel("name.xlsx, sheename =0), а затем столбец за столбцом запустите код. А затем сохраните df в новый xlsx
Пожалуйста, найдите измененный код в вопросе. Я пытался, как вы предлагали, но все еще не работал. Нужно ли что-то включать в код?
@jezrael. Я попробовал ваш код, как вы его дали. Извините, я не очень хорошо знаю Python. Стоит ли упоминать имя файла где-нибудь в вашем коде?
Все еще сталкиваешься с проблемами ... Я думаю, ты не очень хорошо справляешься с тем, чтобы сказать, с какой проблемой ты столкнулся ...
@ Рахул Агарвал. Я снова переформулировал вопрос, чтобы было понятнее.
@ jezrael и Рахул Агарвал. Найдите отредактированный вопрос со скриншотами. Все еще ищу ответ. Спасибо
Прия ... позвольте мне повторить ... есть Excel, как показано, где у вас есть один столбец с именем ACTB, в котором у вас есть 10 значений. Из этих 10 значений вам нужно 3 значения. И это нужно сделать для всех столбцов в опубликованном вами Excel !! Поправьте меня, если я ошибаюсь в понимании проблемы
Да, ты прав. Я хочу, чтобы значения отображались в отдельном столбце, и хочу, чтобы только первые 3 значения отображались в отдельном столбце. Да, я хочу сделать это и для всех столбцов
А теперь ... Вы читали этот excel / csv to python с помощью функции pandas.to_csv? Если да, то выглядит ли pandas df в точности как ваш excel или нет?
@ Рахул Агарвал. Да, в фрейме данных pandas данные выглядели точно так же, как показано в таблице Excel. Да, я прочитал данные из python в функцию csv
Хорошо .. Итак, теперь в вашем df, если вы примените код jezreal ... где и какую ошибку вы получите? Я иду постепенно и медленно ... так что мы наконец-то сможем решить вашу проблему
@ Рахул Агарвал. Я включил код, предоставленный jezreal, под кодом, чтобы сохранить df в Excel. Когда я запускаю код, он не вызывает ошибку и не сохраняет лист Excel.
не сохраняйте напрямую, идите шаг за шагом .. после каждого шага проверяйте, движется ли он к вашему решению ... пробуйте print(df) после каждого шага и проверяйте !! Не проверяйте Excel напрямую
Да, я мог запустить код jezreal, но он выдал ошибку, которую я опубликовал в вопросе. Но лист Excel был сохранен только для узла ACTB, и на этот раз все 150 значений были показаны в отдельном столбце. Но мне просто нужно сохранить только значение 1, значение 75 и значение 150 для всех 134 узлов.
Это вызвало ошибку. Bcoz Я помню, что в вашем предыдущем вопросе в качестве имен столбцов было "Value1" и т.д. и т.д., которых сейчас нет? Итак, вам нужно изменить код в соответствии с вопросом, который вы задали тогда. Тем не менее, если у вас есть df узла ACTB со 150 столбцами, вам просто нужно выбрать нужный столбец, как показано в «Шаге 2» моего ответа. Чтобы запустить этот код для всех столбцов, просто используйте цикл или примените функцию, и все готово !!
@ Рахул Агарвал. Огромное спасибо. Я мог бы использовать цикл for и получить значения для всех 134 переменных. У меня нет заголовка для значений, просто для понимания я разместил порядок значений, который меня интересовал. Можно ли брать только определенные значения ?.
Позвольте нам продолжить обсуждение в чате.
Используйте понимание словаря с помощью 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 Спасибо за вашу помощь
Пожалуйста, обновите свой вопрос для ясности. В первую очередь две вещи: 1) вы говорите, что хотите экспортировать значение 1,3,6 из каждого столбца, но в ваших столбцах есть только списки с 5 значениями и 2) заголовок вашего вопроса должен резюмировать вашу проблему, как она есть сейчас слишком широкий. По сути, вы хотите сначала разделить столбец, содержащий список, на несколько столбцов, а затем выбрать определенные столбцы для экспорта в Excel. Это две разные проблемы.