2015-06-22 42 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。

相关问题