使用此CSV示例:
Source,col1,col2,col3
foo,1,2,3
bar,3,4,5
我使用Pandas的标准方法是:
解析CSV
选择数据框中的列(
col1
和col3
)- 处理列(例如,将
col1
和的值平均化col3
)
是否有一个像Pandas这样的JavaScript库?
Answers:
所有答案都很好。希望我的答案是全面的(即尝试列出所有选项)。我希望以任何标准返回并修改此答案,以帮助做出选择。
希望有人来这里熟悉d3
。d3
在处理Javascript中的数据时非常有用的“瑞士军刀”,例如pandas
对Python很有帮助。您可能会看到d3
经常使用像pandas
,即使d3
是不完全是一个数据帧/大熊猫更换(即d3
不具有相同的API;d3
没有Series
/DataFrame
其行为类似于pandas
)
艾哈迈德(Ahmed)的答案解释了如何使用d3 来实现某些DataFrame功能,并且以下某些库的灵感来自使用和的LearnJsData之类的东西。d3
lodash
至于以DataFrame为重点的功能,我不知所措,这对JS库很有帮助。这是您可能遇到的一些选项的快速列表。我尚未详细检查其中的任何一项(大多数是在Google + NPM搜索中找到的)。
请谨慎使用可以使用的各种工具;有些是Node.js(又名服务器端Javascript),有些是与浏览器兼容的又名客户端Javascript。有些是打字稿。
然后来到这个问题,在这里检查其他答案并进行更多搜索之后,我发现了类似的选项:
我希望这篇文章可以成为社区Wiki,并根据以下不同标准进行评估(即比较上述不同选项):
Jupyter
(如交互式笔记本电脑)等的集成JS库可能无法做的某些事情(但是可以吗?)
我一直在研究JavaScript的数据处理库,称为数据伪造。它受到LINQ和Pandas的启发。
可以这样安装:
npm install --save data-forge
您的示例将如下所示:
var csvData = "Source,col1,col2,col3\n" +
"foo,1,2,3\n" +
"bar,3,4,5\n";
var dataForge = require('data-forge');
var dataFrame =
dataForge.fromCSV(csvData)
.parseInts([ "col1", "col2", "col3" ])
;
如果您的数据位于CSV文件中,则可以这样加载:
var dataFrame = dataForge.readFileSync(fileName)
.parseCSV()
.parseInts([ "col1", "col2", "col3" ])
;
您可以使用该select
方法转换行。
您可以使用提取列,getSeries
然后使用select
方法转换该列中的值。
您可以像这样从数据框中获取数据:
var data = dataFrame.toArray();
平均一列:
var avg = dataFrame.getSeries("col1").average();
您可以做更多的事情。
您可以在npm上找到更多文档。
Ceaveat以下仅适用于d3 v3,而不适用于最新的d4v4!
我只喜欢d3.js,虽然它不能完全替代Pandas,但是如果您花一些时间学习它的范例,它应该能够处理所有为您处理的数据。(而且,如果您最终想在浏览器中显示结果,则非常适合这样做。)
例。我的CSV文件data.csv
:
name,age,color
Mickey,65,black
Donald,58,white
Pluto,64,orange
在同一目录中,创建一个index.html
包含以下内容的:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>My D3 demo</title>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>
<body>
<script charset="utf-8" src="demo.js"></script>
</body>
</html>
以及demo.js
包含以下内容的文件:
d3.csv('/data.csv',
// How to format each row. Since the CSV file has a header, `row` will be
// an object with keys derived from the header.
function(row) {
return {name : row.name, age : +row.age, color : row.color};
},
// Callback to run once all data's loaded and ready.
function(data) {
// Log the data to the JavaScript console
console.log(data);
// Compute some interesting results
var averageAge = data.reduce(function(prev, curr) {
return prev + curr.age;
}, 0) / data.length;
// Also, display it
var ulSelection = d3.select('body').append('ul');
var valuesSelection =
ulSelection.selectAll('li').data(data).enter().append('li').text(
function(d) { return d.age; });
var totalSelection =
ulSelection.append('li').text('Average: ' + averageAge);
});
在目录中,运行python -m SimpleHTTPServer 8181
,然后在浏览器中打开http:// localhost:8181以查看年龄及其平均值的简单列表。
这个简单的示例显示了d3的一些相关功能:
以下是Python numpy和pandas
```
import numpy as np
import pandas as pd
data_frame = pd.DataFrame(np.random.randn(5, 4), ['A', 'B', 'C', 'D', 'E'], [1, 2, 3, 4])
data_frame[5] = np.random.randint(1, 50, 5)
print(data_frame.loc[['C', 'D'], [2, 3]])
# axis 1 = Y | 0 = X
data_frame.drop(5, axis=1, inplace=True)
print(data_frame)
```
在JavaScript *中可以实现相同的效果[ numjs仅适用于Node.js ],但是D3.js具有许多高级的数据文件集选项。numjs和Pandas-js仍在工作。
import np from 'numjs';
import { DataFrame } from 'pandas-js';
const df = new DataFrame(np.random.randn(5, 4), ['A', 'B', 'C', 'D', 'E'], [1, 2, 3, 4])
// df
/*
1 2 3 4
A 0.023126 1.078130 -0.521409 -1.480726
B 0.920194 -0.201019 0.028180 0.558041
C -0.650564 -0.505693 -0.533010 0.441858
D -0.973549 0.095626 -1.302843 1.109872
E -0.989123 -1.382969 -1.682573 -0.637132
*/
我认为最接近的是像这样的库:
特别是Recline具有一个Dataset对象,该对象的结构有点类似于Pandas数据帧。然后,它允许您将数据与“视图”连接,例如数据网格,图形,地图等。视图通常是现有的最佳可视化库(例如D3,Flot,SlickGrid等)周围的薄包装。
这是Recline的示例:
//加载一些数据 var数据集= recline.Model.Dataset({ 记录: [ {value:1,date:'2012-08-07'}, {值:5,b:'2013-09-07'} ] //而是加载CSV数据 //(并且Recline支持更多的数据源类型) //网址:“ my-local-csv-file.csv”, //后端:“ csv” }); //从HTML中为查看器获取一个元素 var $ el = $('#data-viewer'); var allInOneDataViewer = new recline.View.MultiView({ 型号:数据集, 埃尔:$ el }); //您的新数据查看器将上线!
@neversaint您的等待结束。对Danfo.js表示欢迎,它是像tensorflow.js上构建的Javascript库之类的熊猫,并支持开箱即用。这意味着您可以将danfo数据结构转换为张量。您可以进行分组,合并,合并,绘图和其他数据处理。
在javascript中解析CSV很容易,因为每一行实际上已经是一个javascript数组。如果将csv加载到字符串数组(每行一个)中,则很容易加载具有以下值的数组数组:
var pivot = function(data){
var result = [];
for (var i = 0; i < data.length; i++){
for (var j=0; j < data[i].length; j++){
if (i === 0){
result[j] = [];
}
result[j][i] = data[i][j];
}
}
return result;
};
var getData = function() {
var csvString = $(".myText").val();
var csvLines = csvString.split(/\n?$/m);
var dataTable = [];
for (var i = 0; i < csvLines.length; i++){
var values;
eval("values = [" + csvLines[i] + "]");
dataTable[i] = values;
}
return pivot(dataTable);
};
然后getData()
按列返回值的多维数组。
我已经在jsFiddle中为您演示了这一点。
当然,如果您不信任输入,就无法轻松做到这一点-如果您的数据中可能包含脚本,而eval可能会被提取,等等。
这是一种动态方法,假定第1行上已有头文件。csv加载d3.js
。
function csvToColumnArrays(csv) {
var mainObj = {},
header = Object.keys(csv[0]);
for (var i = 0; i < header.length; i++) {
mainObj[header[i]] = [];
};
csv.map(function(d) {
for (key in mainObj) {
mainObj[key].push(d[key])
}
});
return mainObj;
}
d3.csv(path, function(csv) {
var df = csvToColumnArrays(csv);
});
然后,您可以使用访问R,python或Matlab数据框类似的数据的每一列df.column_header[row_number]
。