熊猫阅读科学记数法并改变

时间:2015-12-01 06:15:28

标签: python csv pandas

我在pandas中有一个数据帧,我正在从csv读取。

我的一个列的值包含NaNfloats和科学记数法,即5.3e-23

我的麻烦在于,当我在csv中阅读时,pandas会将这些数据视为object dtype,而不是float32。我猜是因为它认为科学记数条目是字符串。

我已尝试在阅读后使用df['speed'].astype(float)转换dtype,并尝试使用df = pd.read_csv('path/test.csv', dtype={'speed': np.float64}, na_values=['n/a'])来指定dtype 。这会引发错误ValueError: cannot safely convert passed user dtype of <f4 for object dtyped data in column ...

到目前为止,这些方法都没有奏效。我错过了一个非常容易解决的问题吗?

this question似乎建议我可以指定可能引发错误的已知数字,但如果可能的话,我更愿意将科学记数法转换回浮点数。

编辑以评论中要求的CSV显示数据

7425616,12375,28,2015-08-09 11:07:56,0,-8.18644,118.21463,2,0,2
7425615,12375,28,2015-08-09 11:04:15,0,-8.18644,118.21463,2,NaN,2
7425617,12375,28,2015-08-09 11:09:38,0,-8.18644,118.2145,2,0.14,2
7425592,12375,28,2015-08-09 10:36:34,0,-8.18663,118.2157,2,0.05,2
65999,1021,29,2015-01-30 21:43:26,0,-8.36728,118.29235,1,0.206836151554794,2
204958,1160,30,2015-02-03 17:53:37,2,-8.36247,118.28664,1,9.49242000872744e-05,7
384739,,32,2015-01-14 16:07:02,1,-8.36778,118.29206,2,Infinity,4
275929,1160,30,2015-02-17 03:13:51,1,-8.36248,118.28656,1,113.318511172611,5

3 个答案:

答案 0 :(得分:2)

很难说没有看到你的数据,但你的行中似乎存在问题,除了数字和'n / a'值之外,它们还包含其他内容。您可以加载数据框,然后将其转换为数字,如that问题的答案中所示。如果您有pandas版本&gt; = 0.17.0,那么您可以使用以下内容:

df1 = df.apply(pd.to_numeric, args=('coerce',))

然后您可以使用dropna删除包含NA值的行,或者使用fillna

填充零值

答案 1 :(得分:0)

我意识到导致我的数据出现问题的是infinity语句。使用查找和替换删除此工作。

@Anton Protopopov的回答也和@ DSM关于我没有输入df['speed'] = df['speed'].astype(float)的评论一样。

感谢您的帮助。

答案 2 :(得分:0)

就我而言,使用pandas.round()是有效的。

df['column'] = df['column'].round(2)