使用Java中的DataFrame
你是否熟悉DataFrame?
DataFrame是一个非常方便的库和对象,常用于在Python和R语言中处理数据、进行机器学习。它提供了处理表格数据和二维数组数据的各种功能。
就像Excel或CSV一样,可以一次读取数据,提取二维数组的任意行列,还可以像进行SQL操作一样,将表连接起来。无论如何,这在使用二维数据时是必不可少的。
但是在Java中,没有与这个DataFrame相当的实现,无法享受DataFrame带来的好处,数据处理需要花费更多时间,因此会遭遇一些悲伤的经历,比如被谩骂为为什么不用Python等。
梦神数据科学框架
不过,那里有一线光明。
Morpheus数据科学框架提供了与该DataFrame(可能)相等的功能。链接:https://github.com/zavtech/morpheus-core
让我们按照一个简单的例子来尝试。
考虑一个汽车特征数据集,可以在这里访问。下面的代码将此CSV数据加载到Morpheus DataFrame中,筛选行以仅包括那些具有功率重量比> 0.1的车辆(其中重量转换为千克),然后添加一列以记录高速公路和城市里程(MPG)之间的相对效率,按照这个新添加的列按降序对行进行排序,最后将这个转换后的结果记录到CSV文件中。
这个例子中,我们将使用车辆特性数据。将CSV文件读入Morpheus DataFrame,过滤出馬力重量比超过0.1的行,并添加高速公路/城市区的MPG燃料比率列。按照添加的列进行排序,并将结果输出到CSV文件中。
样本代码和执行结果
import com.zavtech.morpheus.frame.*;
public class MorpheusTester {
public static void main(String[] args) {
DataFrame.read().csv(options -> {
options.setResource("http://zavtech.com/data/samples/cars93.csv");
options.setExcludeColumnIndexes(0);
}).rows().select(row -> {
double weightKG = row.getDouble("Weight") * 0.453592d;
double horsepower = row.getDouble("Horsepower");
return horsepower / weightKG > 0.1d;
}).cols().add("MPG(Highway/City)", Double.class, v -> {
double cityMpg = v.row().getDouble("MPG.city");
double highwayMpg = v.row().getDouble("MPG.highway");
return highwayMpg / cityMpg;
}).rows().sort(false, "MPG(Highway/City)").write().csv(options -> {
options.setFile("./cars93m.csv");
options.setTitle("DataFrame");
});
}
}
由于返回类型是DataFrame类型,因此可以使用方法链依次执行csv()、select()、add()和sort()。csv()部分非常充满DataFrame的味道。

DataFrame具有丰富的功能,测试其是否具有相同功能并不容易,但可以确认进行行抽取、列添加和排序等操作。
我认为在处理数据时,可以考虑使用Java。