Pandas数据帧浮点索引和转置错误

时间:2014-08-12 07:18:15

标签: python matplotlib pandas dataframe transpose

我正在尝试将空间分隔文件中的数据正确导入到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()

起初,我遇到了pandas作为字符串处理电压的问题,因为pandas对浮点索引不起作用。尝试最初开始我的二极管电流 - 电压关系图为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)

似乎所有东西都正确加载到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

2 个答案:

答案 0 :(得分:0)

我想出了如何完全在熊猫中完成这项工作。不要指出索引或标题行。转置数据帧并删除索引。然后,从第一行数据中创建一个列表,这将是您真正想要的列的字符串标题。将列名称分配给此列表,然后将数据帧重新分配给切片的数据帧,从而消除第一行字符串名称(在我的情况下为&#39; vfd3021&#39;)。

在那之后,你很高兴。列是浮动的,因为我的电压范围是固定的,所以我只是在绘制时创建一个带有范围的列表。

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)

答案 1 :(得分:-1)

据我所知,你所有的问题都来自于没有获取数据 正确的格式开始。只需专注于导入数据并打印您要绘制的内容 检查类型是否是您期望的类型。

我建议使用不同的方法导入数据,因为文件格式不是pandas 效果最好(例如它是转置的)。例如,您可以使用numpy.genfromtxt,会给出here的介绍。

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 dictionary comprehension创建数据字典,然后将其传递给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

我怀疑这将完全回答你的问题但是在绘制之前获取数据是一个开始,我认为这是你的问题。尽量保持简单!