Плавающий индекс Pandas dataframe и ошибка транспонирования

Я пытаюсь правильно импортировать данные из файла с разделителями-пробелами в кадр данных pandas, чтобы я мог правильно его построить. Мой файл данных выглядит так:

Vmeas   -5.00E+000  -4.50E+000  -4.00E+000  -3.50E+000 ...
vfd3051 -3.20E-008  -1.49E-009  1.38E-008   -1.17E-008 ...
vfd3151 -3.71E-008  -6.58E-009  -6.58E-009  -6.58E-009 ...
vfd3251 -4.73E-008  3.59E-009   8.68E-009   -1.68E-008 ...
vfd3351 -2.18E-008  -3.71E-008  3.60E-009   -3.20E-008 ...

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

Мой код для чтения файла данных в кадр данных:

if __name__ == '__main__':
    file_path = str(input("Enter the filename to open:  "))
    save = str(input('Do you wish to save a pdf of the IV plots? (y/n): '))
    df = pd.read_csv(file_path, index_col="Vmeas", delim_whitespace=True, header=0)
    df = df.T
    df.reset_index(inplace=True)
    df.index.names = ['Voltage']
    df.columns.names = ['Die_numbers']
    df.drop('index',axis=1, inplace=True)
    make_plots(df, save)

Фактическое построение выполняется:

def make_plots(df, save):
    voltage = np.arange(-5, 20, 0.5)
    plt.figure(figsize=(10, 7))
    for col in df:
        plt.plot(voltage, col, legend=False)
    plt.show()

Сначала я столкнулся с проблемами, когда напряжение обрабатывается пандами как строка, и поскольку панды плохо работают с индексами с плавающей запятой. Сначала мой график зависимости тока от напряжения на диоде начинался с нуля. (http://i.imgur.com/wgIZCyq.jpg) Затем я повторно проиндексировал его, но последующее построение графика все равно не сработало. Теперь я переиндексировал фрейм данных, удалил старый столбец индекса, и когда я проверяю df.head(), все выглядит правильно:

Die_numbers       vfd3051       vfd3151           vfd3251          vfd3351  
Voltage                                                               
0                -3.202241e-08 -3.711351e-08 -4.728576e-08 -2.184733e-08   
1                -1.493095e-09 -6.580329e-09  3.594383e-09 -3.710431e-08   
2                 1.377107e-08 -6.581644e-09  8.683344e-09  3.595368e-09 

за исключением того, что теперь я продолжаю сталкиваться с ValueError в mpl. Я думаю, что это связано с тем, что значения col являются строками, а не числами с плавающей запятой, что я не понимаю, потому что раньше он правильно печатал токи.

Признаться, я новичок в пандах, но кажется, что меня на каждом шагу останавливают, по невежеству, несомненно, но это становится утомительным. Есть лучший способ сделать это? Возможно, мне следует просто игнорировать первую строку файла журнала? Могу ли я преобразовать экспоненциальную запись во время чтения файла? Продолжать отключаться?

Спасибо.

df.info(): Int64Index: 51 запись, от 0 до 50 Столбцы: 1092 записи, от vfd3051 до vfd6824 dtypes: float64(1092)

Кажется, все загружается в pandas правильно, но mpl что-то не нравится в данных. Столбцы являются числами с плавающей запятой, я не использую индекс целых чисел. Если бы имена столбцов добавлялись в качестве моей первой строки, столбцы рассматривались бы как тип str или obj. Ошибка:

 Traceback (most recent call last):
  File "D:\Python\el_plot_top_10\IV_plot_all.py", line 51, in <module>
    make_plots(df, save)
  File "D:\Python\el_plot_top_10\IV_plot_all.py", line 21, in make_plots
    plt.plot(voltage, col, legend=False)
  File "C:\Anaconda3\lib\site-packages\matplotlib\pyplot.py", line 2987, in plot
    ret = ax.plot(*args, **kwargs)
  File "C:\Anaconda3\lib\site-packages\matplotlib\axes.py", line 4139, in plot
    for line in self._get_lines(*args, **kwargs):
  File "C:\Anaconda3\lib\site-packages\matplotlib\axes.py", line 319, in _grab_next_args
    for seg in self._plot_args(remaining, kwargs):
  File "C:\Anaconda3\lib\site-packages\matplotlib\axes.py", line 278, in _plot_args
    linestyle, marker, color = _process_plot_format(tup[-1])
  File "C:\Anaconda3\lib\site-packages\matplotlib\axes.py", line 131, in _process_plot_format
    'Unrecognized character %c in format string' % c)
ValueError: Unrecognized character f in format string

person zeppelin_d    schedule 12.08.2014    source источник
comment
Вы можете опубликовать версии pandas/numpy? должен soln выглядит хорошо для меня. показать также df.info().   -  person Jeff    schedule 12.08.2014
comment
версия numpy — 1.8.1, pandas: 0.14.1 и python 3.4.1.   -  person zeppelin_d    schedule 12.08.2014


Ответы (2)


Я понял, как заставить это работать полностью в pandas. Не указывайте ни индекс, ни строку заголовка. Транспонируйте фрейм данных и удалите индекс. Затем создайте список из первой строки данных, которые будут вашими заголовками строк для столбцов, которые вы действительно хотели. Назначьте имена столбцов этому списку, а затем переназначьте фрейм данных нарезанному фрейму данных, исключив первую строку имен строк (в моем случае «vfd3021»).

После этого можно идти. Столбцы являются плавающими, и, поскольку мой диапазон напряжения фиксирован, я просто создаю список с диапазоном при построении графика.

if __name__ == '__main__':
    file_path = str(input("Enter the filename to open:  "))
    save = str(input('Do you wish to save a pdf of the IV plots? (y/n): '))

    df = pd.read_csv(file_path, delim_whitespace=True)

    df = df.T
    df.reset_index(inplace=True)
    df.index.names = ['Voltage']
    df.columns.names = ['Die_numbers']
    df.drop('index', axis=1, inplace=True)
    names = df.iloc[0].values
    df.columns = names
    df = df[1:]
    make_plots(df, save)
person zeppelin_d    schedule 13.08.2014

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

Я бы посоветовал использовать другой метод для импорта данных, так как формат файла не тот, с которым панды работают лучше всего (например, он транспонирован). Например, вы можете использовать numpy.genfromtxt, введение дано здесь< /а>.

import numpy as np
from StringIO import StringIO 

data_file = (
"""Vmeas   -5.00E+000  -4.50E+000  -4.00E+000  -3.50E+000
vfd3051 -3.20E-008  -1.49E-009  1.38E-008   -1.17E-008
vfd3151 -3.71E-008  -6.58E-009  -6.58E-009  -6.58E-009
vfd3251 -4.73E-008  3.59E-009   8.68E-009   -1.68E-008
vfd3351 -2.18E-008  -3.71E-008  3.60E-009   -3.20E-008
""")

data = np.genfromtxt(StringIO(data_file), dtype=None)

print data

>>> array([('Vmeas', -5.0, -4.5, -4.0, -3.5),
       ('vfd3051', -3.2e-08, -1.49e-09, 1.38e-08, -1.17e-08),
       ('vfd3151', -3.71e-08, -6.58e-09, -6.58e-09, -6.58e-09),
       ('vfd3251', -4.73e-08, 3.59e-09, 8.68e-09, -1.68e-08),
       ('vfd3351', -2.18e-08, -3.71e-08, 3.6e-09, -3.2e-08)], 
      dtype=[('f0', 'S7'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8')])

Итак, теперь у нас есть пустой массив кортежей с именами столбцов в качестве первого индекса и всеми данными в качестве остальной части кортежа. Самое главное, что все числа являются числами, старайтесь избегать строк, потому что преобразования запутаны.

Затем мы могли бы сделать следующее, чтобы получить красивый pandas DataFrame:

DataDictionary = {row[0]:list(row)[1:] for row in iter(data)}
pd.DataFrame(DataDictionary)

Сначала мы создаем словарь данных, используя понимание словаря Python. , затем передайте это в файл DataFrame. Это приводит к хорошему фрейму данных со столбцами, названными строками «Vmeas», «vdf*» и индексом всех данных.

    Vmeas   vfd3051          vfd3151         d3251          vfd3351
0   -5.0    -3.200000e-08   -3.710000e-08   -4.730000e-08   -2.180000e-08
1   -4.5    -1.490000e-09   -6.580000e-09   3.590000e-09    -3.710000e-08
2   -4.0    1.380000e-08    -6.580000e-09   8.680000e-09    3.600000e-09
3   -3.5    -1.170000e-08   -6.580000e-09   -1.680000e-08   -3.200000e-08

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

person Greg    schedule 12.08.2014
comment
Если вы собираетесь поместить его во фрейм, то используйте методы синтаксического анализа pandas (и НАМНОГО быстрее, чем genfromtext), не говоря уже о том, что не нужно повторять и преобразовывать в список. - person Jeff; 12.08.2014
comment
Я согласен, что это будет быстрее, но я не смог найти в документах никакого метода для переноса данных перед их чтением. Я был бы рад увидеть альтернативные ответы, поскольку я уверен, что есть лучшие методы, но насколько я могу судить нет ничего плохого в том, что я сделал? - person Greg; 12.08.2014
comment
Конечно, это транспонирует данные, но поскольку Vmeas находится в той же строке исходных данных, то и в том же столбце транспонированных данных. В результате значения -5.00E+000 не преобразуются, что вызывало проблемы для OP. - person Greg; 12.08.2014
comment
Я не уверен, каковы его проблемы, точное решение в его вопросе работает для меня. - person Jeff; 12.08.2014
comment
Грег, спасибо за ваши усилия и объяснение. Если я не могу исправить ошибку mpl, я сделаю это. Отмечу это как ответ, если сделаю. - person zeppelin_d; 12.08.2014