从另一个DataFrame初始化新的DataFrame时,dtypes发生了变化

时间:2016-08-30 07:23:15

标签: python pandas dataframe casting multiple-columns

假设我有一个包含2列的DataFrame df1:a dtype boolb dtype int64。当我从df1_bis初始化新的DataFrame(df1)时,即使我强制a的dtype,列bdf1_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参数有什么问题吗?

2 个答案:

答案 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)

造成问题的是numpypandas推断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