从csv数据集

时间:2018-02-01 17:07:12

标签: python csv networking matrix

我是一个新的Python用户,如果问题看起来很愚蠢,请原谅我。

我有一个.csv格式的数据集,我需要从中创建一个二进制矩阵。它看起来像是:

A (events), B (group1), C (group2), D (group3) 
1           isis        al qaeda
2           al qaeda
3           boko h. 
4           boko h.     al shabaab  isis

我想创建一个二进制矩阵(nxm),其中col A = n,m是B,C,D中包含的唯一元素的列表。因此,我的输出应该如下所示:

A (events), isis, al qaeda, boko h., al shabaab 
1            1      1        0        0
2            0      1        0        0  
3            0      0        1        0      
4            1      0        1        1

矩阵内的元素是[0; 1]。在第一个数据集中为0时,对于事件A(i),未记录特定组,否则为1。

我不知道怎么做......你能帮助我吗?感谢

1 个答案:

答案 0 :(得分:0)

首先需要读取所有数据并确定唯一条目集。有了这个,您可以创建要使用的列的排序列表。接下来,使用列表推导将数据的每一行写入输出CSV文件,以确定是否存在给定的列条目:

import csv

with open('input.csv', 'rb') as f_input:
    csv_input = csv.reader(f_input)
    header = next(csv_input)
    data = list(csv_input)
    unique = sorted(set(x for row in data for x in row[1:]))

with open('output.csv', 'wb') as f_output:    
    csv_output = csv.writer(f_output)
    csv_output.writerow([header[0]] + unique)

    for row in data:
        csv_output.writerow([row[0]] + [1 if e in row[1:] else 0 for index, e in enumerate(unique)])

这假设您使用的是Python 2.x,并且您的输入CSV数据以逗号分隔。对于Python 3.x,您需要更改两行:

with open('input.csv', 'r', newline='') as f_input:
with open('output.csv', 'w', newline='') as f_output: