我正在阅读一个大型平面文件,该文件已经为多列的数据加上了时间戳。数据有一个布尔列,可以是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。
答案 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})
关键字参数可以使用字典,其中键是列名,值是要应用的函数。