Pandas数据框操作和绘图

4
使用WinPython 3.4和matplotlib 1.3.1,我正在从mysql数据库中提取数据框。从查询中获得的原始数据框如下所示:
            wafer_number test_type  test_pass  x_coord  y_coord  test_el_id wavelength intensity
        0       HT2731      T2          1       38       54          24      288.68   4413
        1       HT2731      T2          1       40       54          25      257.42   2595
        2       HT2731      T2          1       50       54          28      300.00   2836
        3       HT2731      T2          1       52       54          29      300.00   2862
        4       HT2731      T2          1       54       54          30      300.00   3145
        5       HT2731      T2          1       56       54          31      300.00   2804
        6       HT2731      T2          1       58       54          32      255.69   2803
        7       HT2731      T2          1       59       54          33      257.23   2991
        8       HT2731      T2          1       60       54          34      262.45   3946
        9       HT2731      T2          1       62       54          35      291.84   9398
        10      HT2801      T2          1       38       55          54      288.68   4125
        11      HT2801      T2          1       38       56          55      265.25   4258

我需要的是将波长和强度分别绘制在x和y轴上,每个不同的晶片号码作为自己的系列。我需要保留x_coord和y_coord变量,以便我可以稍后通过单击它们并将它们添加到列表来识别突出数据点。在绘制这些图表后,我会让这些功能正常工作。
我认为使用内置数据框绘图功能需要执行透视表方法。
wl_vs_int = results.pivot_table(values='intensity', rows=['x_coord', 'y_coord','wavelength'], cols='wafer_number')

在我的数据框上,然后将数据框转换为:
        wafer_number    HT2478  HT2625  HT2644  HT2671  HT2673  HT2719  HT2731  HT2796  HT2801
 x_coord  y_coord   wavelength                                  
    27      35  289.07   NaN     NaN     NaN     5137    NaN     NaN     NaN     NaN     NaN
            36  250.88   4585    NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
            37  260.90   NaN     NaN     NaN     NaN     4270    NaN     NaN     NaN     NaN
            38  288.87   NaN     NaN     NaN     8191    NaN     NaN     NaN     NaN     NaN
            40  259.74   NaN     NaN     NaN     NaN     17027   NaN     NaN     NaN     NaN
            41  259.74   NaN     NaN     NaN     NaN     18742   NaN     NaN     NaN     NaN
            42  259.74   NaN     NaN     NaN     NaN     34098   NaN     NaN     NaN     NaN
    28      34  268.27   NaN     NaN     NaN     NaN     2080    NaN     NaN     NaN     NaN
            38  257.42   7727    NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
            44  260.13   NaN     NaN     NaN     NaN     55329   NaN     NaN     NaN     NaN

但现在索引是x、y坐标和波长的多重索引,因此当我尝试打印wl vs列时,

plt.scatter(wl_vs_int.wavelength, wl_vs_int.columns)

我遇到了 AttributeError 错误:

AttributeError: 'DataFrame' object has no attribute 'wavelength'

我尝试将数据框重新索引到默认索引,但仍然显示“DataFrame”对象没有“wavelength”属性的结果。
必须有更好的方法,可以通过内置的数据框绘图功能重新排列数据框以使其成为可能,或者绘制仅选择某些列与其他列(列是动态的)。 明显我是Python和Pandas的新手,但我已经花费了几天的时间以不同的方式尝试做到这一点,却毫无结果。 如有任何帮助,将不胜感激。 谢谢。

我不清楚你需要x和y坐标的方式。假设你不需要它们,如果你从行列表中删除它们,是否可以工作? - user1462309
我会尝试使用命令df.groupby('wafer_number')按晶圆编号对数据进行分组。 - Guillaume Jacquenot
1个回答

3

要在x轴和y轴上分别绘制波长和强度,并将每个不同的晶片编号作为自己的系列,可以根据 wafer_number 对数据进行分组,然后处理每个组数据。

import pandas as pd
from StringIO import StringIO
import matplotlib.pyplot as plt

data = \
"""wafer_number,test_type,test_pass,x_coord,y_coord,test_el_id,wavelength,intensity
HT2731,T2,1,38,54,24,288.68,4413
HT2731,T2,1,40,54,25,257.42,2595
HT2731,T2,1,50,54,28,300.00,2836
HT2731,T2,1,52,54,29,300.00,2862
HT2731,T2,1,54,54,30,300.00,3145
HT2731,T2,1,56,54,31,300.00,2804
HT2731,T2,1,58,54,32,255.69,2803
HT2731,T2,1,59,54,33,257.23,2991
HT2731,T2,1,60,54,34,262.45,3946
HT2731,T2,1,62,54,35,291.84,9398
HT2801,T2,1,38,55,54,288.68,4125
HT2801,T2,1,38,56,55,265.25,4258"""

df = pd.read_csv(StringIO(data),sep = ',')
dfg = df.groupby('wafer_number')

colors = 'bgrcmyk'
fig, ax = plt.subplots()
for i,k in enumerate(dfg.groups.keys()):
    currentGroup = df.loc[dfg.groups[k]]
    color = colors[i % len(colors)]
    ax.plot(currentGroup['wavelength'].values,currentGroup['intensity'].values,\
            ls='', color = color, label = k, marker = 'o', markersize = 8)
legend = ax.legend(loc='upper center', shadow=True)
plt.xlabel('wavelength')
plt.ylabel('intensity')
plt.show()

我不认为他在试图做那件事。问题陈述中指出波长是x轴。 - user1462309
那个可以用,而且正是我需要的。它比我想象中需要的更加复杂,但它完成了工作。我只需要花些时间来理解它。关于你上面的评论,我需要x和y坐标,这样当用户在图中点击该点时,我就可以识别每个点。谢谢! - zeppelin_d
但是,如果上述解决方案有效,则不使用绘图的x和y坐标? - cwharland
没问题。我不需要它们出现在图表上,只需要它们存在于数据框中,这样当我点击某个点时,就能够给我该点的x和y坐标。 - zeppelin_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接