Pandas读取CSV时不遵循正则分隔符

2024-05-14 18:05:46 发布

您现在位置:Python中文网/ 问答频道 /正文

数据

from io import StringIO
import pandas as pd

s = '''ID,Level,QID,Text,ResponseID,responseText,date_key,last
375280046,S,D3M,Which is your favorite?,D5M0,option 1,2012-08-08 00:00:00,ynot
375280046,S,D3M,How often? (at home, at work, other),D3M0,Work,2010-03-31 00:00:00,okkk
375280046,M,A78,Do you prefer a, b, or c?,A78C,a,2010-03-31 00:00:00,abc
376918925,M,A78,Which ONE (select only one),A78E,Milk,2004-02-02 00:00:00,launch Wed., '''

df = pd.read_csv(StringIO(s), sep=r',(?!\s)')

问题:我问了一个问题here。但我遇到了一个新问题。注意最后一行的末尾是一个逗号和一个空格。sep=r',(?!\s)'中的正则表达式应该忽略后跟空格的逗号。在

问题:有没有一种方法可以将最后一列按字面上的launch Wed.,来读,其中逗号不是分隔符/分隔符,而是last列文本中的逗号-只使用pd.read_csv?在

错误

^{pr2}$

预期/期望输出

          ID Level  QID                                  Text ResponseID  \
0  375280046     S  D3M               Which is your favorite?       D5M0   
1  375280046     S  D3M  How often? (at home, at work, other)       D3M0   
2  375280046     M  A78             Do you prefer a, b, or c?       A78C   
3  376918925     M  A78           Which ONE (select only one)       A78E   

  responseText             date_key           last  
0     option 1  2012-08-08 00:00:00           ynot  
1         Work  2010-03-31 00:00:00           okkk  
2            a  2010-03-31 00:00:00            abc  
3         Milk  2004-02-02 00:00:00  launch Wed.,   

Tags: textimportidwhichlaunchlevelatpd
2条回答

read_csv在尝试识别分隔符之前,似乎正在从字符串末尾剥离空格。可以通过修改regex来解决这一问题,同时检查在文件结尾之前标识的逗号:

pd.read_csv(StringIO(s), sep=r',(?!\s|\Z)', engine='python')
Out[347]: 
          ID Level  QID                                  Text ResponseID  \
0  375280046     S  D3M               Which is your favorite?       D5M0   
1  375280046     S  D3M  How often? (at home, at work, other)       D3M0   
2  375280046     M  A78             Do you prefer a, b, or c?       A78C   
3  376918925     M  A78           Which ONE (select only one)       A78E   

  responseText             date_key          last  
0     option 1  2012-08-08 00:00:00          ynot  
1         Work  2010-03-31 00:00:00          okkk  
2            a  2010-03-31 00:00:00           abc  
3         Milk  2004-02-02 00:00:00  launch Wed.,  

让我们看看这个SO Post。在

使用上面解释的正则表达式r',(?=\S)'。在

from io import StringIO
import pandas as pd

s = '''ID,Level,QID,Text,ResponseID,responseText,date_key,last
375280046,S,D3M,Which is your favorite?,D5M0,option 1,2012-08-08 00:00:00,ynot
375280046,S,D3M,How often? (at home, at work, other),D3M0,Work,2010-03-31 00:00:00,okkk
375280046,M,A78,Do you prefer a, b, or c?,A78C,a,2010-03-31 00:00:00,abc
376918925,M,A78,Which ONE (select only one),A78E,Milk,2004-02-02 00:00:00,launch Wed., '''

df = pd.read_csv(StringIO(s), sep=r',(?=\S)')

输出:

^{pr2}$

相关问题 更多 >

    热门问题