我有三列,如下所示:
Sales Population Income Price
14 48777.0 285.0 nan
17 12550.0 1.0 nan
24 15664.0 14.0 14
9 23796.0 24.0 0
20 40149.0 63.0 nan
75 39489.0 32.0 nan
我需要将所有内容都转换为人均值,也就是说,对于销售中的每个元素,我需要将其除以相应的人口。例如,对于销售,我想按人口除以得到人均销售额:
Per capita sales
14/48777
17/12550
...
我使用的命令是:
data['Per Capita Sales'] = data['Sales'] / data['Population']
但是我遇到了以下错误:
TypeError: ufunc 'true_divide' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''
有人知道如何解决此问题吗?我已经在线搜索了如何将一个列除以另一列元素,但是没有找到一种安全的方法...由于值“ nan”和“ 0”的列在分子中,因此我不知道为什么会有错误...
非常感谢您的帮助!
答案 0 :(得分:0)
很可能,涉及的至少一列是 string 类型。 我建议不要将它们转换为仅用于除法,而是将其转换为 提前编号,用于所有其他操作:
data.Sales = pd.to_numeric(data.Sales)
data.Population = pd.to_numeric(data.Population)
如我所见,所有行都包含有效数据,因此上面(缩短的)形式应该足够了。
但是,如果您的数据“脏”(某些条目不能转换为数字),
您应该添加errors='coerce'
参数。
然后您原来的除法命令应该起作用。
如果不确定DataFrame中的列类型,请执行:
data.info()
或者也许您从文件中加载DataFrame,例如打电话给read_csv
?
在这种情况下,请包含dtype
参数(格式为 {“ column name”:type} 的字典)
强制使用特定类型的特定列。
答案 1 :(得分:0)
您也可以尝试:
df['Per Capita Sales'] = df.astype('float').apply(lambda x: x['Sales']/x['Population'], axis =1)