如何使pandas read_csv根据引用区分字符串

时间:2013-12-05 14:20:34

标签: python parsing csv pandas

我希望pandas.io.parsers.read_csv根据我的csv文件中的字符串始终为"quoted"来区分字符串和其他数据类型。可能吗? 我有以下csv示例:

"ID"|"DATE"|"NAME"|"YEAR"|"FLOAT"|"BOOL"
"01"|2000-01-01|"Name1"|1975|1.2|1
"02"||""||||

它应该给我一个数据框,其中所有被引用的人都是字符串。很可能大熊猫会把其他所有东西都做成np.float64,但之后我可以处理它。我想等待使用dtype,因为我有很多列,我不想为所有列映射类型。如果可能的话,我想尝试仅以"quote"为基础。

我尝试使用quotechar='"'quoting=3,但quotechar根本没有做任何事情,而quoting保留""我不会也想要。在我看来,pandas解析器应该能够做到,因为这是区分csv文件中字符串的方法。

1 个答案:

答案 0 :(得分:0)

指定dtypes会更直接,但如果您不想这样做,我建议您使用quoting=3并在之后进行清理。

strip_char = lambda x: x.strip('"')

In [40]: df = pd.read_csv(StringIO(s), sep='|', quoting=3)

In [41]: df
Out[41]: 
   "ID"      "DATE"   "NAME"  "YEAR"  "FLOAT"  "BOOL"
0  "01"  2000-01-01  "Name1"    1975      1.2       1
1  "02"         NaN       ""     NaN      NaN     NaN

[2 rows x 6 columns]

In [42]: df = df.rename(columns=strip_char)

In [43]: df[['ID', 'NAME']] = df[['ID', 'NAME']].applymap(strip_char)

In [44]: df
Out[44]: 
   ID        DATE   NAME  YEAR  FLOAT  BOOL
0  01  2000-01-01  Name1  1975    1.2     1
1  02         NaN          NaN    NaN   NaN

[2 rows x 6 columns]

In [45]: df.dtypes
Out[45]: 
ID        object
DATE      object
NAME      object
YEAR     float64
FLOAT    float64
BOOL     float64
dtype: object

编辑:然后你可以设置索引:

In [11]: df = df.set_index('ID')

In [12]: df
Out[12]: 
          DATE   NAME  YEAR  FLOAT  BOOL
ID                                      
01  2000-01-01  Name1  1975    1.2     1
02         NaN          NaN    NaN   NaN

[2 rows x 5 columns]