访问d3.js中没有标题行的CSV文件

时间:2016-06-17 18:41:13

标签: javascript python csv d3.js

我有一个包含数据的CSV文件:

,tests,Mary,Joe,Frank
0,Test1,92,15,72
1,Test2,74,25,70
2,Test3,30,65,50
3,Test4,82,80,48  

此数据来自空格分隔的文本文件,转换为pandas中的数据框,然后转换为csv文件,以便在d3.js驱动的散点图中使用。

我想将数据绑定到点,以便该散点图上的每个点都包含

之类的信息
studentname: Joe
Test1: 15
Test2: 25
Test3: 65
Test4: 80

每个学生和每个考试。我有一个像

这样的功能
d3.csv('path/to/file.csv', function(error, data) {
    if error throw error;
    data.forEach(function(d) {
         d.studentname = d.name;
         d.test = d.tests;
         d.score = d.studentscore;
    })});
我知道

不会按照我想要的方式访问数据。如何才能获得正确选择我想要的数据的功能?

1 个答案:

答案 0 :(得分:0)

首先,您的CSV无法正常工作,因为您没有标题中第一个元素的名称。

如果你这样做,并且你读了数据集的第一个元素,你会得到类似的东西:

randomname(this i made up) : 0
tests : Test1
mary : 92
joe : 15
frank : 72

所以要以你想要的格式得到它你必须循环这个并创建一个新的数据集,就像这样(我记得很简单,我将它转换为JSON以便在JSFiddle中轻松工作)。可能还有更简单的方法:

创建单个学生对象:

var newData = [];

for (var i in data[0]) { //create individual student objects
  if (i != 'randomname' && i != 'tests') {
    newData.push({
      studentName: i 
    })
  }
}

创建数组以获取个别学生的索引。我这样做是为了更容易检索单个学生对象以给他们测试数据:

var elementPos = newData.map(function(x) {
    return x.studentName; //create array to get index of each student
  });

现在循环浏览数据,找到每个学生并给他们一个测试分数:

for (var i = 0; i < data.length; i++) { //loop through data
  for (var j in data[i]) { //loop through each element in data[i]
    if (j != 'tests' && j != 'randomname') { //get all students test scores
      var thisStudent = newData[elementPos.indexOf(j)]; //get student object array based on index
      thisStudent["test" + i] = data[i][j]; //set testscore, incremented
    }
  }
}

工作小提琴:https://jsfiddle.net/thatOneGuy/h7b2p2eh/1/

工作代码:

var data = [{
  "randomname": 0,
  "tests": "Test1",
  "Mary": 92,
  "Joe": 15,
  "Frank": 72
}, {
  "randomname": 1,
  "tests": "Test2",
  "Mary": 74,
  "Joe": 25,
  "Frank": 70
}, {
  "randomname": 2,
  "tests": "Test3",
  "Mary": 30,
  "Joe": 65,
  "Frank": 50
}, {
  "randomname": 3,
  "tests": "Test4",
  "Mary": 82,
  "Joe": 80,
  "Frank": 48
}];

var newData = [];

for (var i in data[0]) { //create individual student objects
  if (i != 'randomname' && i != 'tests') {
    newData.push({
      studentName: i 
    })
  }
}


var elementPos = newData.map(function(x) {
    return x.studentName; //create array to get index of each student
  });

for (var i = 0; i < data.length; i++) { //loop through data
  for (var j in data[i]) { //loop through each element in data[i]
    if (j != 'tests' && j != 'randomname') { //get all students test scores
      var thisStudent = newData[elementPos.indexOf(j)]; //get student object array based on index
      thisStudent["test" + i] = data[i][j]; //set testscore
    }
  }
}



console.log(newData)