【问题标题】:Pandas dataframe float index and transpose error熊猫数据框浮动索引和转置错误
【发布时间】:2014-08-12 07:18:15
【问题描述】:

我正在尝试将数据从空格分隔文件正确导入到 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 值是字符串而不是浮点数有关,我不明白,因为它之前正确地打印了电流。

诚然,我是 pandas 的新手,但我似乎每时每刻都停下来,毫无疑问,由于我的无知,但这越来越令人厌烦。有一个更好的方法吗?也许我应该忽略日志文件的第一行?我可以在读取文件时从科学计数法转换吗?继续插电?

谢谢。

df.info() 是: Int64Index:51 个条目,0 到 50 列:1092 个条目,vfd3051 到 vfd6824 数据类型: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

【问题讨论】:

  • 你能发布 pandas/numpy 版本吗? soln 对我来说应该看起来不错。也显示df.info()
  • numpy 版本为 1.8.1,pandas:0.14.1 和 python 3.4.1

标签: python matplotlib pandas dataframe transpose


【解决方案1】:

我想出了如何使这项工作完全在 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)

【讨论】:

    【解决方案2】:

    据我所知,您的所有问题都来自未将您的数据放入 正确的格式开始。只需专注于导入数据并打印您要绘制的内容 检查类型是否符合您的预期。

    我建议使用不同的方法来导入数据,因为文件格式不是 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
    

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

    【讨论】:

    • 如果你要把它放在一个框架中,那么使用 pandas 解析方法(并且比 genfromtext 快得多),更不用说,不需要迭代和转换为列表。
    • 我同意它会更快,但我在文档中找不到任何方法来在读取数据之前转置数据。我很高兴看到其他答案,因为我确信有更好的答案方法,但据我所知,我所做的并没有什么问题?
    • 当然这会转置数据,但是因为“Vmeas”在初始数据的同一行中,所以它在转置数据的同一列中。结果,值“-5.00E+000”未转换,这导致 OP 出现问题。
    • 我不确定他的问题是什么,他问题中的确切解决方案对我有用。
    • 格雷格,感谢您的努力和解释。如果我无法解决 mpl 错误,我会这样做。如果我这样做,会将其标记为答案。
    猜你喜欢
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2022-07-10
    • 2020-09-30
    • 2018-01-08
    • 1970-01-01
    相关资源
    最近更新 更多