我正在尝试将空间分隔文件中的数据正确导入到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
答案 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
我怀疑这将完全回答你的问题但是在绘制之前获取数据是一个开始,我认为这是你的问题。尽量保持简单!