2015-06-22 40 views
2

我有這段代碼操縱數據集以通過從現有列中提取信息來創建新列。爲了使用另一個數據集使用pd.merge函數正確地匹配數據,我想將'Channel ID'列轉換爲整數。儘管目前使用.astype(INT)的結果數據類型顯示爲float64與.INFO()看着框架未能將pandas數據框中的列轉換爲整數數據類型

def cost(received_frame): 
    received_frame.columns = ['Campaign', 'Ad Spend'] 
    campaigns = received_frame['Campaign'] 
    ID = [] 
    for c in campaigns: 
     blocks = re.split('_', c) 
     for block in blocks[1:]: 
      if len(block) == 6 and block.isdigit(): 
       ID.append(block) 
    ID = pd.Series(ID).str.replace("'","") 
    ID = pd.DataFrame(ID) 
    both = [ID,received_frame] 
    frame = pd.concat(both,axis=1) 
    frame.columns = ['Channel ID', 'Campaign', 'Ad Spend'] 
    frame['Channel ID'] = frame['Channel ID'].dropna().astype(int) 
    return frame 
+0

如果您可以共享您正在處理的數據,這將有所幫助。 –

回答

4

當你寫

frame['Channel ID'].dropna().astype(int) 

你回來了一系列可能更少的索引,因爲你正在放棄NAs。

然後,當你將其指定爲

frame['Channel ID'] = frame['Channel ID'].dropna().astype(int) 

它執行一種與現有的值(根據指數)合併,而這些都是浮動,所以它必須得將這些。

根據您的問題,您應該用其他東西替換它(fillna?)。

+0

明白了!謝謝,但我仍然無法正確合併數據幀:( – bpr

1

假設frame看起來是這樣的:

import numpy as np 
import pandas as pd 
frame = pd.DataFrame({'Channel ID':['1',np.nan,'2'], 'foo':['bar','baz',np.nan]}) 

Channel ID foo 
0   1 bar 
1  NaN baz 
2   2 NaN 

你可以從frame落行,其中Channel ID是楠:

mask = pd.notnull(frame['Channel ID']) 
frame = frame.loc[mask] 

然後astype(int)會成功轉換列D型int

frame['Channel ID'] = frame['Channel ID'].astype(int) 

產量

Channel ID foo 
0   1 bar 
2   2 NaN 

由於阿米Tavory解釋的,你不能僅僅從frame['Channel ID']

掉落的NaN
frame['Channel ID'] = frame['Channel ID'].dropna() 

,因爲在分配時對齊右側的索引與左側的 相關行。它對右側未提及索引的左側行沒有影響。所以NaN仍保留在更大的DataFrame中,即 frame

由於NaN是浮點值,因此只要該列包含NaN,dtype就必須保持爲浮點dtype。

相關問題