我有这个代码,它通过从现有列中提取信息来操作数据集来创建新列。为了使用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
答案 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。