我有一只熊猫数据,我想递增地附加行。我的问题是,当尝试实现值时,它们的类型就会丢失。对于成为'boolean'
的'object'
(int
vingfloat
仍然是一件坏事,但至少程序的其余部分仍然可以运行,只是效率较低),这一点尤为恼人:
data1 = pd.DataFrame()
data1['foo'] = 5
print("*\n",data1.dtypes)
data2 =pd.DataFrame()
data2['bar'] = True
print("**\n",data2.dtypes)
data3 = pd.concat([data1, data2])
print("***\n",data3.dtypes)
data4 = data1.append(data2)
print("****\n",data4.dtypes)
*
foo int64
dtype: object
**
bar bool
dtype: object
***
bar object
foo float64
dtype: object
****
bar object # <-- bool type becomes object
foo float64
dtype: object
你知道如何预防吗?
发布于 2016-12-08 08:47:38
该问题的解决办法:
列的类型被更改,以允许用np.nan
表示的缺失值的表示(因为该行添加或遗漏了一些列,而不是它所附加的数据)。
根据经验,添加/连接一个新行导致缺失信息将以这种方式改变类型:
int64
->float64
bool
--> float64
bool
--> object
发布于 2016-12-07 20:02:48
您的问题在行和列之间混在一起。在熊猫中,每一列都有一个类型,每一行都得到每一列的类型。
当您执行data1['foo'] = [some values]
时,您定义了一个新的列,当您用不同的列名称追加两个数据格式时,您将:
将其他行追加到此框架的末尾,返回一个新对象。不在此框架中的列作为新列添加。。
(见这里)
另一方面,使用concat
do列堆栈的数据,保持列数据类型。
最后,请注意您的列赋值需要使用括号。即
data1['foo'] = [5]
而不是
data1['foo'] = 5
编辑:,本着您的评论精神,我做了一个小实验,试图遵循您的意图:
df = pd.DataFrame() # Creating a DF
df['a'] = [1,2,3] # Adding a column of integers
df['b'] = [True, False, True] # Adding a column of Boolean
print df['b'].dtype
>bool
我们看到,“b”确实是“bool”。
添加包含部分数据的行:
df = df.append({'a':1}, ignore_index=True)
print df['b'].dtype
>float64
现在col 'b‘改为float64,以支持NaN类型。这就是众所周知的“矮胖”( numpy NaN 明白了 )。
最后,使用以下方法打印df
结果:
print df
a b
0 1.0 1.0
1 2.0 0.0
2 3.0 1.0
3 1.0 NaN
发布于 2021-08-18 10:59:05
import pandas as pd
# https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.astype.html
# create DataFrame
d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)
df.dtypes
col1 int64
col2 int64
dtype: object
# Keep dtypes
ser_types = df.dtypes
ser_types
col1 int64
col2 int64
dtype: object
# Chnange dtypes for test purpose
df = df.astype('float64').copy()
df.dtypes
col1 float64
col2 float64
dtype: object
# Series dtype to dictionary
ser_types.to_dict()
{'col1': dtype('int64'), 'col2': dtype('int64')}
# Chnage dtype from initial df
df = df.astype(ser_types.to_dict()).copy()
df.dtypes
col1 int64
col2 int64
dtype: object
df
col1 col2
0 1 3
1 2 4
https://stackoverflow.com/questions/41023525
复制相似问题