2016-12-07 63 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