我有一个包含大约28列和4000行的CSV文件。从这些列中的两列我想绘制约50个特定行。我用pandas来选择文件的这一部分,但我无法弄清楚,它是如何以正确的方式读取科学数字的。
我的代码:
import pandas as pd
import matplotlib.pyplot as plt
df = pd.read_csv("20180416309.csv", sep=";")
x = df.loc[df[u'run#'] == 3, [u' Diameter']].values
y = df.loc[df[u'run#'] == 3, [u' dN/dlnD']].values
plt.plot(x, y)
plt.show
所以,我试图绘制列'直径'和你'dN / dlnD'列在列'u'run#'时显示数字3.在IPython控制台中键入“x”或“y”,给出正确的数字。
不幸的是,情节看起来像这样:
如您所见,忽略y轴上这些数字的科学记数法的十进制幂。我怎样才能解决这个问题? 这是我第一次尝试使用matplotlib和pandas,所以请原谅我的初学者问题。
编辑:
文件数据如下所示:
run#; Diameter; dN/dlnD;
12; +3,58151E+01; +1,17336E+03;
13; +3,26913E+01; +6,06044E+03;
13; +2,98524E+01; +1,76516E+04;
13; +2,72704E+01; +4,88716E+04;
13; +2,49202E+01; +1,00035E+05;
使用IPython控制台读出我的“x”或“y”数据,输出如下:
[' +1,94251E+02'],
[' +5,23981E+02'],
[' +0,00000E+00'],
[' +1,10525E+02'],
[' +0,00000E+00'],
[' +4,76363E+01'],
[' +1,61714E+01'],
[' +1,65482E+02'],
[' +0,00000E+00'],
[' +4,75312E+02'],
[' +4,20174E+01']], dtype=object)
SOLUTION:
正如您所指出的,逗号就是问题所在。我只是在代码中添加了小数设置:
df = pd.read_csv("test.csv", sep=";", decimal=",")
现在图表看起来应该看起来如何。
谢谢!
答案 0 :(得分:0)
很明显,csv数据没有按照您的预期正确读取或更具体。根据您的示例,您的所有数据都被读取为字符串,包括数字。原因是根据您的语言环境,您的文件中的数字格式将无法正确解释。我修改了您提供的小数据片段,以便句点而不是逗号表示我的语言环境中惯常的小数点。如您所见,数据已正确读入数据框。
df = pd.read_csv("d:\\users\\floyd\\documents\\sample.csv", sep=';'); df
Out[72]:
run# Diameter dN/dlnD
0 12 35.8151 1173.36
1 13 32.6913 6060.44
2 13 29.8524 17651.60
3 13 27.2704 48871.60
4 13 24.9202 100035.00
我还用这个删除了列名中令人讨厌的前导空格。
df.columns = [col.strip() for col in df.columns]; df.columns
现在它正确地绘制。
plt.plot(df['Diameter'], df['dN/dlnD'])
Out[75]: [<matplotlib.lines.Line2D at 0x25ef97bd0b8>]