从另一个 DataFrame 初始化一个新的 DataFrame 时 dtypes 改变了
dtypes changed when initialising a new DataFrame from another one
假设我有一个包含 2 列的 DataFrame df1:a
和 dtype bool
以及 b
和 dtype int64
。当我从 df1
初始化一个新的 DataFrame (df1_bis
) 时,列 a
和 b
会自动转换为对象,即使我强制使用 df1_bis
的 dtype :
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
参数做错了什么吗?
对我来说作品:
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
导致问题的是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
假设我有一个包含 2 列的 DataFrame df1:a
和 dtype bool
以及 b
和 dtype int64
。当我从 df1
初始化一个新的 DataFrame (df1_bis
) 时,列 a
和 b
会自动转换为对象,即使我强制使用 df1_bis
的 dtype :
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
参数做错了什么吗?
对我来说作品:
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
导致问题的是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