是否有一种方法可以在转换到DataFrame时指定类型?
是的。其他答案在创建DataFrame之后转换dtypes,但是我们可以在创建时指定类型。根据输入格式使用DataFrame.from_records或read_csv(dtype=…)。
后者有时是必要的,以避免大数据的内存错误。
1. DataFrame.from_records
从所需列类型的结构化数组创建DataFrame:
x = [['foo', '1.2', '70'], ['bar', '4.2', '5']]
df = pd.DataFrame.from_records(np.array(
[tuple(row) for row in x], # pass a list-of-tuples (x can be a list-of-lists or 2D array)
'object, float, int' # define the column types
))
输出:
>>> df.dtypes
# f0 object
# f1 float64
# f2 int64
# dtype: object
2. read_csv (dtype =…)
如果从文件中读取数据,则使用read_csv的dtype参数在加载时设置列类型。
例如,这里我们读取30M行,其评级为8位整数,类型为分类:
lines = '''
foo,biography,5
bar,crime,4
baz,fantasy,3
qux,history,2
quux,horror,1
'''
columns = ['name', 'genre', 'rating']
csv = io.StringIO(lines * 6_000_000) # 30M lines
df = pd.read_csv(csv, names=columns, dtype={'rating': 'int8', 'genre': 'category'})
在这种情况下,我们在加载时将内存使用量减半:
>>> df.info(memory_usage='deep')
# memory usage: 1.8 GB
>>> pd.read_csv(io.StringIO(lines * 6_000_000)).info(memory_usage='deep')
# memory usage: 3.7 GB
这是避免大数据内存错误的一种方法。加载后并不总是可以更改dtype,因为我们可能没有足够的内存来加载默认类型的数据。