一、路径错误
Python3 pandas read_csv 报错:IOError: Initializing from file failed
Python3使用read_csv的时候,如果传入的参数不是文件名而是文件的路径,就会报这个错。
原因应该是这个库的问题,解决方法是,先切换到这个目录,然后传文件名作为参数。
出错代码:
import pandas as pd
trainFile = "F:/Projects/Python/coursera/intro-to-data-science/kaggle/data/train.csv"
trainData = pd.read_csv(trainFile)
改进代码:
import pandas as pd
import os
trainFile = "F:/Projects/Python/coursera/intro-to-data-science/kaggle/data/train.csv"
pwd = os.getcwd()
os.chdir(os.path.dirname(trainFile))
trainData = pd.read_csv(os.path.basename(trainFile))
os.chdir(pwd)
二、内存错误
数据分析中,调用的变量过多的话,需要先del掉一些变量,再显式调用gc.collect().
python话说会自己管理内存,实际上,对于占用很大内存的对象,并不会马上释放。举例,a=range(10000*10000),会发现内存飙升一个多G,del a 或者a=[]都不能将内存降下来。。
del 可以删除多个变量,del a,b,c,d
办法:
import gc (garbage collector)
del a
gc.collect()
三、df重构错误
在使用pandas进行数据操作时遇到了如下问题:
首先对数据进行了抽取:
equ_data = equ_data[equ_data["link_id"] == link_id]
抽取完之后equ_data的index 变成了乱序的,如下:
log_time ratio
16626 2018/2/25 18:44:06 0.00
16650 2018/2/25 18:59:52 0.00
16668 2018/2/25 19:04:52 0.00
16692 2018/2/25 19:09:52 0.00
16705 2018/2/25 19:14:52 0.00
希望把equ_data的index 变成range(len(equ_data)),如下:
log_time ratio
0 2018/2/25 18:44:06 0.00
1 2018/2/25 18:59:52 0.00
2 2018/2/25 19:04:52 0.00
3 2018/2/25 19:09:52 0.00
4 2018/2/25 19:14:52 0.00
尝试了网上的做法,re_index()是用来更新index顺序的,并不能修改index。
equ_data= equ_data.reindex(index=range(len(equ_data)))
并且,reindex()会增加更多的index,其他列值可以设置为NAN,或bfill(向前填充),backfill(向后填充)。
df.reindex(index=list, fill_value=0)
df.reindex(index=list, method='bfill')
rename()方法可以修改列名和index名,但必须一一指定,如下:
test.rename(columns={"log_time":"Log_time", "ratio1":"Ratio1"}, inplace=True)
test.rename(index={16626:0}, inplace=True)
效果如下:
Log_time Ratio
0 2018/2/25 18:44:06 0.00
16650 2018/2/25 18:59:52 0.00
16668 2018/2/25 19:04:52 0.00
16692 2018/2/25 19:09:52 0.00
16705 2018/2/25 19:14:52 0.00
不可能对所有的index都一一指定,所以该方法不可行。
最后想到重新构建DataFrame:
data = {"log_time": pd.Series(equ_data["log_time"].values),
"ratio1": pd.Series(equ_data["ratio1"].values)}
new_df = pd.DataFrame(data)
四、spyder调试界面不显示
是reload(sys)的问题
import sys
# reload改变了输出路径,需要改正回来
sto,stin = sys.stdout,sys.stdin
reload(sys)
sys.setdefaultencoding('utf-8')
sys.stdout,sys.stdin = sto,stin
然后重新启动spyder即可