按列的内容对Maple数据帧进行排序

时间:2016-07-14 17:30:33

标签: sorting dataframe maple

我有一个存储在Maple数据框中的数据集,我希望按给定列中的值进行排序。我的例子比较大,但数据是这样的,我有两列数据,一列有一些数值,另一列有字符串。例如,假如我将数据框构造为:

Mydata := DataFrame(<<2,1,3,0>|<"Red","Blue","Green","Orange">>, columns = [Value,Color] );

我喜欢sort命令之类的东西能够返回相同的数据帧,其中Value列中的数字按升序或降序排序,但sort命令似乎不支持数据帧。关于如何对此进行排序的任何想法?

1 个答案:

答案 0 :(得分:3)

你是对的,sort命令目前不支持DataFrames(但它应该!)。我已经通过converting DataFrame列(DataSeries)到Vector,使用output = permutation选项对Vector进行排序,然后通过结果索引DataFrame。使用您的示例:

Mydata := DataFrame(<<2,1,3,0>|<"Red","Blue","Green","Orange">>, columns = [Value,Color] );
sort( convert( Mydata[Value], Vector ), output = permutation );

返回:

    [4, 2, 1, 3]

通过此结果索引原始DataFrame,然后按Value列的升序返回已排序的DataFrame:

Mydata[ sort( convert( Mydata[Value], Vector ), output = permutation ), .. ];
Mydata[ [4, 2, 1, 3], .. ];

返回:

        [     Value     Color  ]
        [                      ]
        [4      0      "Orange"]
        [                      ]
        [2      1       "Blue" ]
        [                      ]
        [1      2       "Red"  ]
        [                      ]
        [3      3      "Green" ]

那就是说,我需要多次对DataFrames进行排序,所以我还创建了一个似乎适用于我的大多数数据集的过程。此过程使用类似的使用sort命令的方法,但它不需要任何数据转换,因为它适用于Maple DataFrame对象本身。为此,我需要设置kernelopts(opaquemodules = false)以便直接使用内部DataFrame数据对象(您还可以对中间矩阵和向量进行一系列转换,但这种方法限制了重复内部数据的数量。创建):

DSort := proc( self::{DataFrame,DataSeries}, {ByColumn := NULL} )
    local i, opacity, orderindex;
    opacity := kernelopts('opaquemodules' = false):
    if type( self, ':-DataFrame' ) and ByColumn <> NULL then
        orderindex := sort( self[ByColumn]:-data, ':-output' = ':-permutation', _rest );
    elif type( self, ':-DataSeries' ) and ByColumn = NULL then
        orderindex := sort( self:-data, ':-output' = ':-permutation', _rest );
    else
        return self;
    end if;
    kernelopts(opaquemodules = opacity): #Set opaquemodules back to original setting
    if type( self, ':-DataFrame' ) then
        return DataFrame( self[ orderindex, .. ] );
    else
        return DataSeries( self[ orderindex ] );
    end if;
end proc:

例如:

DSort( Mydata, ByColumn=Value ); 

返回:

        [     Value     Color  ]
        [                      ]
        [4      0      "Orange"]
        [                      ]
        [2      1       "Blue" ]
        [                      ]
        [1      2       "Red"  ]
        [                      ]
        [3      3      "Green" ]

这也适用于字符串,因此DSort( Mydata, ByColumn=Color );应该有效。

        [     Value     Color  ]
        [                      ]
        [2      1       "Blue" ]
        [                      ]
        [3      3      "Green" ]
        [                      ]
        [4      0      "Orange"]
        [                      ]
        [1      2       "Red"  ]

在此过程中,我将其他参数传递给sort命令,这意味着您还可以添加升序或降序选项,这样您就可以执行DSort( Mydata, ByColumn=Value, `>` );以降序返回DataFrame'价值'顺序(虽然这似乎不适合字符串)。