如何使用Wolfram Mathematica修改列中的数据?

时间:2017-07-10 22:21:12

标签: machine-learning wolfram-mathematica data-cleaning

我正在处理一个Dataset个对象,其中有一列名为Property

数据如下图所示:

a column of this kind of data

根据范围,我想分配一个新值,并最终替换相关的整个列。例如,如果范围是500-5000,我想得到值1,对于5000-50000,我想给值2,依此类推。

2 个答案:

答案 0 :(得分:1)

据我了解,您希望通过修改数据集来重新编码数据集的一列。据我所知,数据集并非真正设计为可变类型。如果你能接受,这有两种方法可以继续。

首先,让我们得到一些人工数据。

ds = Dataset[<|"x" -> RandomInteger[10], 
     "y" -> Interval[{10^#, 10^(# + 1)}]|> & /@ Range[5]]

现在假设我们想要使用函数f重新编码第二列:

ds[All, {2 -> f}]

请注意原始数据集未更改。 (通常是件好事。) 这是一个试用的示例函数。

f[x_Interval] := Log[10, x[[1, 1]]]
ds[All, {2 -> f}]

现在一个很大的问题是你的新数据集有一个名称完全相同但解释完全不同的列。如果这困扰您,您可以使用新名称附加到数据集。

Append[#, "y2" -> f[#y]] & /@ ds

修改

那些美元符号怎么样?除非你向我们展示一个条目的完整形式,否则我必须猜测。所以我猜想以下人工数据让我们足够接近有用:

ds = Dataset[<|"x" -> RandomInteger[10], 
 "y" -> Quantity[Interval[{10^#, 10^(# + 1)}], "USDollars"]|> & /@ Range[5]]

这意味着我们需要在f中进行一些小改动:

f[Quantity[Interval[{x_, _}], _]] := Log[10, x]

然后我们可以像以前一样替换或追加:

ds[All, {2 -> f}]
Append[#, "y2" -> f[#y]] & /@ ds

答案 1 :(得分:0)

如果我们将网格stuff与列整数x(从1开始,因为我们在mathematica中)命名为&#34;属性&#34;,获取转换范围列的代码x - 我认为你想要的 - 如下:

Replace[#1[[1]] & /@ stuff, x_ :> IntegerLength[x[[1, 1]]] - 2, {1}]

它占用指定列中的所有范围,并从范围下半部分的长度中减去2以得到结果。

例如,如果我们采用您的样本范围:

stuff = {{$Interval[{500, 50000}], things, things},
  {$Interval[{5000, 5000000}], things, things}}

通过Replace

运行它
Replace[#1[[1]] & /@ stuff, x_ :> IntegerLength[x[[1, 1]]] - 2, {1}]

我们得到Out:

{1, 2}

然后,您可以轻松修改上面的Replace,为您提供stuff的原位转换列。