【问题标题】:Change CSV before importing it to pandas在将其导入熊猫之前更改 CSV
【发布时间】:2017-08-29 17:07:37
【问题描述】:

我在尝试导入 pandas 的 CSV 文件时遇到问题。文件结构如下:

  • 文件的第一个字符是单引号;
  • 文件的最后一个字符是单引号;
  • CSV 的每一行都以双引号开头,以双引号结尾,后跟 \n

所以我在使用 pandas.read_csv 导入它时遇到问题。理想情况下,我希望 pandas 在导入时忽略单引号和双引号(不考虑数据框的结构,也不将它们作为字符导入)。

我真的不知道是否应该在使用 pandas.read_csv 之前处理 CSV 文件,或者我是否可以选择忽略这些字符。

【问题讨论】:

  • 包含示例文件和您尝试过的代码

标签: python csv pandas quotes double-quotes


【解决方案1】:

pd.read_csv 方法的第一个参数是文件名或流。

您可以手动读取文件并在将流交给 pandas 之前对其进行操作。

sio = StringIO("id,category,value\n1,beer,2.40\n2,wine,6.40\n3,$$$Theawsomestuff$$$###,166.00"
pd.read_csv(sio)
   id                 category  value
0   1                     beer    2.4
1   2                     wine    6.4
2   3  $$$Theawsomestuff$$$###  166.0

因此子类化 StringIO 你可以改变read 方法的行为

class StreamChanger(StringIO):
    def read(self, **kwargs):
        data = super().read(**kwargs)
        data = data.replace("$", "")
        data = data.replace("#", "")
        return data

sio = StreamChanger("id,category,value\n1,beer,2.40\n2,wine,6.40\n3,$$$Theawsomestuff$$$###,166.00")
pd.read_csv(sio)
   id                 category  value
0   1                     beer    2.4
1   2                     wine    6.4
2   3           Theawsomestuff  166.0

【讨论】:

    【解决方案2】:

    使用参数 'quoting' 并将值 3 传递给 read_csv。创建数据框后,您应该注意数据和标题中的引号。

    import pandas as pd
    
    
    df=pd.read_csv('check.txt',doublequote=True,delimiter=',',quoting=3)
    df=df.replace({'"': '','\'':''}, regex=True)
    df.columns = ['Id1','StartTime','start_lat','start_long','StartGeohash']
    
    print df 
    

    示例文件

    'Id1,StartTime,start_lat,start_long,StartGeohash
    "113,2016-11-01 10:50:28.063,-33.139507,-100.226715,9vbsx2" 
    "113,2016-11-02 10:49:24.063,-33.139507,-100.226715,9vbsx2" 
    "115,2016-11-03 10:55:20.063,-36.197660,-101.186050,9y2jcm"'
    

    输出

       Id1                StartTime  start_lat  start_long StartGeohash
    0  113  2016-11-01 10:50:28.063 -33.139507 -100.226715      9vbsx2 
    1  113  2016-11-02 10:49:24.063 -33.139507 -100.226715      9vbsx2 
    2  115  2016-11-03 10:55:20.063 -36.197660 -101.186050       9y2jcm
    

    【讨论】:

    • 感谢您的回答。 delimiter=',',quoting=3 正在做导入文件的技巧,但我仍然必须处理位于第一列和最后一列中的值的双引号。
    • 应该注意这个答案不会改变数据之前它被加载,它会改变它之后。
    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2023-03-13
    • 2018-10-29
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    相关资源
    最近更新 更多