无法将pandas数据帧中的列转换为整数数据类型

时间:2015-06-22 21:21:40

标签: python pandas

我有这个代码,它通过从现有列中提取信息来操作数据集来创建新列。为了使用pd.merge函数和其他数据集正确匹配数据,我想转换通道ID'列到整数。尽管当前使用了.astype(int),结果数据类型显示为float64,使用.info()

查看框架
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

2 个答案:

答案 0 :(得分:4)

写作时

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

您正在返回一个索引可能较少的系列,因为您正在删除NAs。

然后,当您将其指定为

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

它执行一种与现有值的合并(根据索引),这些是浮点数,因此它也必须转换它们。

您应该将其替换为其他内容,具体取决于您的问题(fillna?)。

答案 1 :(得分: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为NaN:

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

然后astype(int)会成功将列转换为dtype int

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

产量

   Channel ID  foo
0           1  bar
2           2  NaN

正如Ami Tavory所解释的那样,你不能仅仅从frame['Channel ID']删除NaNs

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

因为在分配时将右侧的索引与对齐 左侧的相关行。它对左侧的行没有影响,右侧没有提到索引。所以NaNs保留在更大的DataFrame中, frame

由于NaN是一个浮点值,只要该列包含NaN,dtype必须保持float dtype。