2016-12-07 26 views
0

我有一个熊猫数据框,我想要增量追加行。我的问题是,当试图发生价值观时,他们的类型会丢失。这是​​这成为'object'int成为float仍然是一件坏事,但至少在程序的其余部分仍然可以运行,只是效率较低)特烦:为熊猫数据框添加行同时保留类型

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 

你有一个想法,如何预防它?

回答

1

用于解决该问题:

该类型的列的被改变,以允许其通过np.nan表示的缺失值的表示(或者因为与它追加的数据框相比,该行增加或丢失了一些列)。

经验上,追加/串联一个新行诱导缺少的信息将改变类型在这个方式:

  • int64 - >float64
  • bool - >float64如果使用字典设置新线
  • bool - >object如果使用的是数据框设置新线
0

你的问题在行和列之间混合。 在熊猫中,每一列都有一个类型,每一行都会得到每一列的类型。

当你做data1['foo'] = [some values]你定义一个新的 ,当您追加合并两个dataframes与列不同的名称,那么你:

其他该帧的结束

追加行,返回新对象。 不在此框架中的列被添加为新列。

(见here

在使用concat做dataframes的柱堆另一方面,保持列数据类型。

最后,请注意您的列分配需要使用括号。即

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 gotcha

最后,打印df结果与:

print df 

    a b 
0 1.0 1.0 
1 2.0 0.0 
2 3.0 1.0 
3 1.0 NaN 
+0

我不要以为这里有列与行之间的混合。目标是追加包含可能不同的列集的新行。当列不存在于其中一个数据框中时,我希望它在追加/连接之后保持其类型,因为在技术上它的包含是未触及的(对于缺失的值,不包含)。我的猜测是,空值默认是'np.nan'(正确的我),对于'int64'或'bool'不存在,因此这些列的类型切换为同时存储现有数据和'np.nan ' – amougel

+0

现在我更了解你,但不完全。你能用注释中的伪代码更新你的问题吗?即在每一步中解释你打算做什么,以及你期望发生什么。 – yuval

+0

按照您的评论,我编辑了我的答案和其他信息。 – yuval