【问题标题】:pandas parse csv with left and right quote charspandas 用左右引号字符解析 csv
【发布时间】:2017-07-26 09:49:32
【问题描述】:

我正在尝试在 pandas 中读取一个结构如下的文件

<first>$$><$$<second>$$><$$<first>$$>
<foo>$$><$$<bar>$$><$$<baz>$$>

使用pd.read_csv('myflie.csv', encoding='utf8', sep='$$&gt;&lt;$$', decimal=',') 将无法产生有意义的结果。所有数据都被读入单个列,并且不会提取引号。

【问题讨论】:

    标签: python csv parsing pandas


    【解决方案1】:

    您需要通过\ 转义$,因为它被读取为正则表达式(字符串结尾):

    (分隔符 > 1 个字符且不同于 '\s+' 被解释为正则表达式)

    import pandas as pd
    from pandas.compat import StringIO
    
    
    temp=u"""<first>$$><$$<second>$$><$$<first>$$>
    <foo>$$><$$<bar>$$><$$<baz>$$>"""
    #after testing replace 'StringIO(temp)' to 'filename.csv'
    df = pd.read_csv(StringIO(temp), 
                     encoding='utf8', 
                     sep='\$\$><\$\$', 
                     decimal=',', 
                     header=None, 
                     engine='python')
    
    print (df)
             0         1           2
    0  <first>  <second>  <first>$$>
    1    <foo>     <bar>    <baz>$$>
    

    然后对于从最后一列删除$$&gt; 是可能的使用replace(添加&amp; 作为字符串结尾):

    df.iloc[:, -1] = df.iloc[:, -1].str.replace('\$\$>$', '')
    print (df)
             0         1        2
    0  <first>  <second>  <first>
    1    <foo>     <bar>    <baz>
    

    对于删除引用:

    df = df.replace(['^<', '>$'], ['', ''], regex=True)
    print (df)
           0       1      2
    0  first  second  first
    1    foo     bar    baz
    

    两者一起替换:

    df = df.replace(['^<', '>$', '>\$\$'], ['', '', ''], regex=True)
    print (df)
           0       1      2
    0  first  second  first
    1    foo     bar    baz
    

    【讨论】:

    • 我怎样才能另外删除引号 ?常规的 pandas 引号参数只需要一个字符,例如" 但我需要一个左右引号字符。
    • 即有没有比遍历所有列并执行两个调用更好的方法df[0] = df[0].str.replace('&lt;', '') df[0] = df[0].str.replace('&gt;', '') df
    • 哇,答案很好。
    • 如何添加标题以进行替换?目前我会使用 col = df.columns.map(lambda x: x.replace('', '')).values df.columns = col df.head() 这似乎依赖于 pythonic。
    • 我认为更简单的是df.columns = df.columns.to_series().replace(['^&lt;', '&gt;$', '&gt;\$\$'], ['', '', ''], regex=True)
    猜你喜欢
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 2017-07-10
    • 1970-01-01
    • 2016-04-15
    • 2017-10-14
    相关资源
    最近更新 更多