虽然我不敢说对pandas非常熟练,但各种简单的,复杂的pandas函数也用了很多次,但今天遇到的两个大坑,着实让我摔了个大跟头。而且还是非常简单的pandas操作,所以我特意在此记一笔。
1. 坑1. pd.Series元素的获取不能用索引方式,而应该用 .iloc[idx]
有两个txt文件(file1.txt, file2.txt),内容一样,但是file1.txt没有header,file2.txt有header,两个文件的内容分别是:
file1.txt和file2.txt的内容
对file1.txt进行读取,遍历获取line1,line2等元素:
import pandas as pd
file1_path='E:/Test4/file1.txt' # file1 只有三行,不带header
file1_df=pd.read_csv(file1_path,index_col=[0],header=None)
file1_df.head() # 文件读取正常
# 获取元素:
for idx,line in file1_df.iterrows():
# print(idx,'-->',line[0]) # 报错 KeyError: 0
print(idx,'-->',line[1]) # 读取正常,此时的索引为1
如果上面用line[0]会直接报错 KeyError: 0,用索引1就正常。
再来对file2.txt进行读取,遍历获取line1,line2等元素:
file2_path='E:/Test4/file2.txt' # file1 只有三行,带header
file2_df=pd.read_csv(file2_path,index_col=[0])
file2_df.head() # 文件读取正常
# 获取元素:
for idx,line in file2_df.iterrows():
# print(idx,'-->',line[1]) # IndexError: index out of bounds
print(idx,'-->',line[0]) # 读取正常,此时的索引为0
如果上面用line[1]会报错: IndexError: index out of bounds,用索引0正常。
那么问题来了 :同样的文件,就是一个有header,一个没有header,但是索引却有的要用0,有的要用1,这不是坑嘛。
其实,这个坑产生的原因是Series获取元素应该用.iloc[0],将上面两个line[0]或line[1]都换成line.iloc[0]后就正常了。(第一个的line[1]中的1是col_name, 第二个line[0]的0是col index,所以有区别。)
2. 坑2:read_csv()也会坑你没商量
有一个文件:file1.txt,其内容是:
file1.txt的内容,注意中间有"
由于这个文件的第三行line2前面有了一个",所以用read_csv()根本无法读取
import pandas as pd
file1_path='E:/Test4/file1.txt' # file1 只有三行
file1_df=pd.read_csv(file1_path,index_col=[0])
# ParserError: Error tokenizing data. C error: EOF inside string starting at line 2
file1_df.head()
这个简单的txt文件,用read_csv竟然完全无法读取???
报错:ParserError: Error tokenizing data. C error: EOF inside string starting at line 2
我有尝试了一下:如果这个双引号出现在其他位置,是可以正确读取的。比如:
image.png
上面的情况还好,起码pandas会报错,告诉你它读取不了,但下面的情况,它不会报错,但读取的内容却完全不对。。。
另外一种坑用上面的pd.read_csv()可以正常读取,而且不报错,但结果却是。。。。
读取错误的情况
看到没,如果id2和id3之间有N多行,那么会将这N行都当作id2这一行,中间完全没法解析出来。而且双引号也不见了。。。。
刚开始看到这个坑,我以为是index_col=[0]这个参数造成的,去掉这个参数,读取后,仍然是错误的,而且不报错:
image.png
将上面的双引号" 换成单引号',斜杠\ 等都没有问题,这个很有可能是解码时出的错误,而且这个双引号只有在sep之后的位置才会出这种bug。
这个坑死我了。。。我今天对含有多个不同符号,中文的,英文的文本用这个简单的read_csv进行读取,
整个文件有一百多万行啊,
read_csv读取时也没有报任何错误啊,
我后续处理也花费了整整一上午啊,
没有任何问题啊,最后才发现出错了啊,
各种可能的出错都考虑到了啊,
就是没想到错误会出现在pd.read_csv()这个简单的函数上啊。。。。
唉,还是换成python自带的open()来读取最靠谱了。。。。
网友评论