假设我有一个包含2列的DataFrame df1:a
dtype bool
和b
dtype int64
。当我从df1_bis
初始化新的DataFrame(df1
)时,即使我强制a
的dtype,列b
和df1_bis
也会自动转换为对象:
In [2]: df1 = pd.DataFrame({"a": [True], 'b': [0]})
Out[3]:
a b
0 True 0
In [4]: df1.dtypes
Out[4]:
a bool
b int64
dtype: object
In [5]: df1_bis = pd.DataFrame(df1.values, columns=df1.columns, dtype=df1.dtypes)
Out[6]:
a b
0 True 0
In [7]: df1_bis.dtypes
Out[7]:
a object
b object
dtype: object
我对DataFrame的dtype
参数有什么问题吗?
答案 0 :(得分:4)
对我而言:
df1_bis = pd.DataFrame(df1, columns=df1.columns, index=df1.index)
#df1_bis = pd.DataFrame(df1)
print (df1_bis)
a b
0 True 0
print (df1_bis.dtypes)
a bool
b int64
dtype: object
但我认为更好的是使用copy
:
df1_bis = df1.copy()
如果您想使用dtype
,则需要使用Series
,因为DataFrame
中的参数dtype
适用于所有列:
df1_bis = pd.DataFrame({'a':pd.Series(df1.a.values, dtype=df1.a.dtypes),
'b':pd.Series(df1.b.values, dtype=df1.b.dtypes)}
, index=df1.index)
print (df1_bis)
a b
0 True 0
print (df1_bis.dtypes)
a bool
b int64
dtype: object
df = pd.DataFrame({"a": [1,5], 'b': [0,4]}, dtype=float)
print (df)
a b
0 1.0 0.0
1 5.0 4.0
print (df.dtypes)
a float64
b float64
dtype: object
答案 1 :(得分:3)
造成问题的是numpy
。 pandas
推断numpy数组中的类型。如果转换为列表,则不会出现问题。
df1_bis = pd.DataFrame(df1.values.tolist(),
columns=df1.columns)
print(df1_bis)
print
print(df1_bis.dtypes)
a b
0 True 0
a bool
b int64
dtype: object