首页 > 解决方案 > 在python中重新排列csv icw pyvis文件

问题描述

我有一个小项目,对我来说有点令人头疼,因为我并不是真正的 Python 新手,我在周末用 Python 做了几年编程。但我看到有很多方法可以转换 csv 文件中的数据。我不确定该选择哪一个,甚至不知道从哪里开始,但我自己可以做很多研究。

现在我有这个数据集:

这就是我所拥有的:

这就是我要的:

可能你们知道哪个模块最适合给定问题,目前我关注的是 pandas 和 openpyxl。

编辑:这是我用 pyvis 可视化认识彼此的人的数据集,de digit 是联系人计数,列是发起者,行是联系人的接收者提前 Thx!

我的代码是(杂乱的代码):

    basepath = "/home/user/netmap/rc/"
excel_data = []
nodes = []
parsed_data = []
node_data = []
edge_data = []

def generate_parsed_data():
    global nodes
    global parsed_data
    print("parsing dataset:")
    headings = []
    excel_file = open(basepath + "db.csv")
    proof_file = open(basepath + "proof.csv", "w")
    proof_file.write("Source" + "," + "Target" + "," + "Contract count" + "," + "Role" + "," + "Family")
    proof_file.write("\n")
    for line in excel_file:
        parts = line.rstrip().split(',')
        if not headings:
            headings = parts
            continue
        for name,item in zip(headings, parts):
            if item.isdigit():
                #print('          ' + parts[0] + ',' + name + ',' + item)
                parsed_data.append(parts[0] + ',' + name + ',' + item + ',' + parts[-2] + ',' + parts[-1])
                print('      ' + parts[0] + ',' + name + ',' + item + ',' + parts[-2] + ',' + parts[-1])
                proof_file.write(parts[0] + ',' + name + ',' + item + ',' + parts[-2] + ',' + parts[-1])
                proof_file.write('\n')
                nodes.append(parts[0])
    nodes = list(dict.fromkeys(nodes))
    print(int(len(nodes))) #Hier zit het al fout

def get_contact_count(contact_name):
    tmp_list = []
    for i in parsed_data:
        par = i.rstrip().split(',')
        if par[0] == contact_name:
            tmp_list.append(par[1])
    for i in parsed_data:
        par = i.rstrip().split(',')
        if par[1] == contact_name:
            tmp_list.append(par[0])
#    print(tmp_list)
    tmp_list = list(dict.fromkeys(tmp_list))
#    print(tmp_list)
    #print(contact_name + ' has ' + str(len(tmp_list)) + ' contacts')
    return (len(tmp_list))

def generate_edge_data():
    edges_file = open(basepath + "edges.csv", "w")
    print("Tinkering edge data:")
    for e in parsed_data:
        parts = e.rstrip().split(',')
        edges_file.write(parts[0] + ',' + parts[1] + ',' + parts [2])
        print('      ' + parts[0] + ',' + parts[1] + ',' + parts [2])
        edges_file.write('\n')


def generate_node_data():
    print("tinkering node data:")
    global node_data
    nodes_file = open(basepath + "nodes.csv", "w")
    for i in parsed_data:
        parts = i.rstrip().split(',')
        contact_count = get_contact_count(parts[0])
        node_data.append(parts[0] + ',' + parts[3] + ',' + parts[4] + ',' + str(contact_count))
        print('      ' + parts[0] + ',' + parts[3] + ',' + parts[4] + ',' + str(contact_count))
    node_data = list(dict.fromkeys(node_data))
    for i in node_data:
        nodes_file.write(i)
        nodes_file.write('\n')

generate_parsed_data()
generate_node_data()
generate_edge_data()
print("Generated 3 files; edges.csv, nodes.csv & proof.csv...")

上面的代码是为证明、边缘数据和节点数据创建文件的代码。但问题是,当我启动我的 pyvis 脚本时,它说缺少节点,我总共有 127 个节点,只显示了 106 个。

左列是源人员,第一行是目标人员行。看起来当一个节点/源只被定位并且什么都不启动时,它不会被添加到nodes.csv

这也是我制作的第一个 python 脚本。

标签: pythoncsv

解决方案


它不必很复杂。鉴于此程序:

headings = []
for line in open('x.csv'):
    parts = line.rstrip().split(',')
    if not headings:
        headings = parts
        continue
    for name,item in zip(headings, parts):
        if item.isdigit():
            print(','.join((parts[0], name, item)) )

这个输入:

x,joe,pete,david,pascal,jonathan,george
joe,*,6,5,4,3,2
pete,1,*,4,5,2,7
david,2,3,*,6,3,2
pascal,3,,2,*,,1
jonathan,,1,,,*,,
george,1,,,,,

产生这个输出:

joe,pete,6
joe,david,5
joe,pascal,4
joe,jonathan,3
joe,george,2
pete,joe,1
pete,david,4
pete,pascal,5
pete,jonathan,2
pete,george,7
david,joe,2
david,pete,3
david,pascal,6
david,jonathan,3
david,george,2
pascal,joe,3
pascal,david,2
pascal,george,1
jonathan,pete,1
george,joe,1

推荐阅读