Python Pandas 创建 DataFrame 并强制设置多种列类型
我成功创建了一个数据框,并强制设置了一种数据类型,方法是
import pandas as pd
test = pd.DataFrame({'a':[1,2,3], 'b':[1.1,2.1,3.1]}, dtype=int)
但是我想为每一列指定不同的数据类型。我该怎么做呢?我尝试了以下方法,但结果显示的数据类型都是对象类型,'b'列没有被转换成整数。
test = pd.DataFrame({'a':[1,2,3], 'b':[1.1,2.1,3.1]}, dtype=[('a', int),('b', int)])
Jeff帮我解决了上面的情况。但当我尝试创建一个空的数据框,并希望能够指定列的数据类型时,我发现了另一个问题。对于所有列使用相同的数据类型,我可以这样做
test = pd.DataFrame(columns=['a','b'], dtype=int)
如果我想为'a'和'b'分别指定数据类型呢?
3 个回答
3
是的,问得很好。你可以在创建数据框的时候指定一个共同的数据类型,或者添加一些空的 numpy 数组,虽然它们的数据类型可能不同。不过,根据我的经验,pandas 通常会根据你添加的数据来推断整个数据框的数据类型。我觉得在你把数据添加到数据框之后,再为不同的列指定数据类型会更好。
convert_dict = {'a': int, 'b': float}
df = df.astype(convert_dict)
3
你可以传入一个包含 numpy
数组的字典,并指定每个数组的数据类型 dtype
; 这样可以创建既有内容的数组,也可以创建空数组。(这个回答稍微改编自我在这里的回答。)
这是一个空数组:
df = pd.DataFrame(data={'a' : np.array([], dtype=int),
'b' : np.array([], dtype=float)
}
)
这是一个填充好的数组:
df = pd.DataFrame(data={'a' : np.array([1,2,3], dtype=int),
'b' : np.array([4,5,6], dtype=float)
}
)
而且你可以为 dtype
使用几乎任何类型,比如 object
、str
、datetime.datetime
或者你自己定义的 CrazyClassYouDefined
。不过要注意,如果 pandas 不特别支持某种类型(比如 str
),它会把那一列当作 object
来处理。不过别担心,其他一切应该还是能正常工作。
7
你可以传入一个带有数据类型参数的序列。
In [15]: pd.DataFrame({'a':[1,2,3], 'b':[1.1,2.1,3.1]}).dtypes
Out[15]:
a int64
b float64
dtype: object
In [16]: pd.DataFrame({'a':Series([1,2,3],dtype='int32'), 'b':Series([1.1,2.1,3.1],dtype='float32')}).dtypes
Out[16]:
a int32
b float32
dtype: object