繁体   English   中英

熊猫数据框浮点索引和转置错误

[英]Pandas dataframe float index and transpose error

我试图将数据从空格分隔的文件正确导入到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 ...

因此,测试位置最初在行中,列的电压向右增加至20V。

我将数据文件读入数据框的代码是:

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()

刚开始,我遇到了将熊猫当作字符串处理电压的问题,因为熊猫在浮点索引上的表现不佳。 最初尝试将二极管电流-电压关系的图从0开始。( 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 

除了现在我一直在mpl中遇到ValueError。 我认为这与col值是字符串而不是浮点数有关,我不明白这是因为它之前正确打印了电流。

诚然,我是熊猫的新手,但毫无疑问,我似乎无所事事地被熊猫拦住了,但它却变得越来越累。 有一个更好的方法吗? 也许我应该忽略日志文件的第一行? 读入文件时可以从科学计数法转换吗? 继续插电吗?

谢谢。

df.info()是:Int64Index:51个条目,0至50列:1092个条目,vfd3051至vfd6824 dtypes:float64(1092)

一切似乎都能正确加载到熊猫中,但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

我想出了如何完全在熊猫中完成这项工作。 不要指示索引或标题行。 转置数据框并删除索引。 然后,从第一行数据中创建一个列表,这将是您真正想要的列的字符串标题。 将列名称分配给该列表,然后将数据框重新分配为切片的数据框,以消除字符串名称的第一行(在我的情况下为“ 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)

据我所知,您所有的问题都是由于没有以正确的格式获取数据而引起的。 只需专注于导入数据并打印要打印的内容,检查类型是否符合您的期望。

我建议使用其他方法来导入数据,因为文件格式并不是熊猫最适合的格式(例如,转置格式)。 例如,您可以使用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')])

因此,现在我们有了一个元组的numpy数组,其中列名是第一个索引,所有数据都作为其余的元组。 最重要的是,所有数字都是数字,请尽量避免使用字符串,因为转换比较麻烦。

然后,我们可以执行以下操作以获得一个不错的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

我怀疑这能否完全回答您的问题,但这是在绘制数据之前正确获取数据的开始,我认为这是您的问题。 尝试使其尽可能简单!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM