美文网首页
记一笔:pandas简单操作里面的大坑

记一笔:pandas简单操作里面的大坑

作者: 科技老丁哥 | 来源:发表于2019-08-16 14:23 被阅读0次

    虽然我不敢说对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()来读取最靠谱了。。。。

    相关文章

      网友评论

          本文标题:记一笔:pandas简单操作里面的大坑

          本文链接:https://www.haomeiwen.com/subject/knbfsctx.html