pandas:read_csv如何强制bool数据到dtype bool而不是object

时间:2015-04-20 05:27:38

标签: python pandas

我正在阅读一个大型平面文件,该文件已经为多列的数据加上了时间戳。数据有一个布尔列,可以是True / False,也可以没有条目(评估为nan)。

当读取csv时,bool列被转换为对象,因为序列化错误而无法在hdfstore中保存数据。

示例数据:

A    B    C    D
a    1    2    true
b    5    7    false
c    3    2    true
d    9    4

我使用以下命令阅读

import pandas as pd
pd.read_csv('data.csv', parse_dates=True)

一个解决方案是在csv中读取时指定dtype,但我希望有一个更简洁的解决方案,比如convert_objects,我可以指定parse_numeric或parse_dates。

3 个答案:

答案 0 :(得分:6)

由于你的csv中缺少值,因为你有混合dtypes,所以列的dtype显示为object,前三行是boolean,最后一行是float。

要转换NaN值使用fillna,它会接受一个dict,用列映射所需的填充值并生成同质的dtype:

In [9]:

t="""A    B    C    D
a    1    NaN    true
b    5    7    false
c    3    2    true
d    9    4"""
​
df = pd.read_csv(io.StringIO(t),sep='\s+')
​
df
Out[9]:
   A  B   C      D
0  a  1 NaN   True
1  b  5   7  False
2  c  3   2   True
3  d  9   4    NaN
In [11]:

df.fillna({'C':0, 'D':False})
Out[11]:
   A  B  C      D
0  a  1  0   True
1  b  5  7  False
2  c  3  2   True
3  d  9  4  False

答案 1 :(得分:4)

您可以使用dtype,它接受​​字典来映射列:

dtype : Type name or dict of column -> type
    Data type for data or columns. E.g. {'a': np.float64, 'b': np.int32}
import pandas as pd
import numpy as np
import io

# using your sample
csv_file = io.BytesIO('''
A    B    C    D
a    1    2    true
b    5    7    false
c    3    2    true
d    9    4''')

df = pd.read_csv(csv_file, sep=r'\s+', dtype={'D': np.bool})
# then fillna to convert NaN to False
df = df.fillna(value=False)

df 
   A  B  C      D
0  a  1  2   True
1  b  5  7  False
2  c  3  2   True
3  d  9  4  False

df.D.dtypes
dtype('bool')

答案 2 :(得分:0)

从这个very similar question开始,我建议使用转换器kwarg:

href

根据您的评论指出,NaN值应替换为False。

import pandas as pd pd.read_csv('data.csv', converters={'D': lambda x: True if x == 'true' else False}) 关键字参数可以使用字典,其中键是列名,值是要应用的函数。