Excel转Pajek可读文件格式(.net)Python实现

Excel转Pajek可读文件格式(.net)Python实现

第一次在CSDN写东西,打开界面就喜欢上了,太优秀了。。。

选修过复杂网络课,中间需要将Excel数据转为Pajek或是Gephi可读的文件格式

  • 一般Excel数据格式如下
统计国贸易国贸易额
A1B1100
A2B250
A3B380
  • Pajek可读文件格式如下
*Vertices 6
1 ‘‘A1’’
2 ‘‘A2’’
3 “A3”
4 “B1”
5 “B2”
6 “B3”
*Edges
1 4 100
2 5 50
3 6 80

直接上代码吧

import xlrd

workbook = xlrd.open_workbook('C:\\Users\\X\\Desktop\\Pajek_FileType\\汇总.xlsx')
booksheet = workbook.sheet_by_index(0)
country_1 = booksheet.col_values(0, 1)          #读取第2行第1列开始的数据
country_2 = booksheet.col_values(1, 1)          #读取第2行第2列开始的数据
Volume_of_trade = booksheet.col_values(2, 1)    #读取第2行第2列开始的数据

# 删除重复项
sum_country = []
dic=Counter(country_1 + country_2)
sum_country=list(dic.keys())
'''
第一次代码,效率低,废弃
for i in country_1:
    if i not in sum_country:
        sum_country.append(i)
for i in country_2:
    if i not in sum_country:
        sum_country.append(i)
'''
# 处理空数据为0
for i in range(len(Volume_of_trade)):
    if Volume_of_trade[i] == '':
        Volume_of_trade[i] = 0

# 输出文件阶段
file_handle = open('C:\\Users\\X\\Desktop\\Pajek_FileType\\GlobalTrade.net',mode='w+')
file_handle.write('{0} {1}\n'.format('*Vertices', len(sum_country)))
tem_1 = 1  # 计数器
for i in sum_country:
    file_handle.write('{0}  {1}\n'.format(tem_1, '\"'+i+'\"'))
    tem_1 += 1

file_handle.write('*Edges\n')
for i in range(len(country_1)):
    first = sum_country.index(country_1[i]) + 1
    second = sum_country.index(country_2[i]) + 1
    value = Volume_of_trade[i]
    file_handle.write('{0} {1} {2}\n'.format(str(first), str(second), str(value)))
file_handle.close()

运行需要安装xlrd包,有需求的可以在站内搜搜大神的博客,写得很详细,这里就不贴出来了。
第一次写,就算记录自己的成长吧。非常小而且简单的一段代码,但还是有不满意的地方,比如一开始删除重复项,两个for循环能不能优化?format函数** { } ** 中的参数调试,让输出更好看。。。
欢迎大佬指教,也希望有共同爱好,喜欢代码喜欢编程的朋友一起学习

改进 2019.1.22


原代码删除重复项使用了两个for循环,这在实际运用(数据量达到百万级别)将会耗费大量时间,新的方法采用Counter函数,该方法可以将对列表元素进行统计,返回一个字典对象,其速度较之前的方法提升非常巨大
原代码效:

import time
import xlrd
workbook = xlrd.open_workbook('C:\\Users\\X\\Desktop\\Pajek_FileType\\汇总.xlsx')
booksheet = workbook.sheet_by_index(0)
country_1 = booksheet.col_values(0, 1)
country_2 = booksheet.col_values(1, 1)
Volume_of_trade = booksheet.col_values(7, 1)

# 删除重复项
t1=time.time()
sum_country = []
for i in country_1:
    if i not in sum_country:
        sum_country.append(i)
for i in country_2:
    if i not in sum_country:
        sum_country.append(i)
t2 = time.time()
print(t2-t1)

输出为:
在这里插入图片描述
改进代码条件下:

from collections import Counter
import xlrd
import time
workbook = xlrd.open_workbook('C:\\Users\\X\\Desktop\\Pajek_FileType\\汇总.xlsx')
booksheet = workbook.sheet_by_index(0)
country_1 = booksheet.col_values(0, 1)
country_2 = booksheet.col_values(1, 1)
Volume_of_trade = booksheet.col_values(7, 1)

# 删除重复项
t1=time.time()

dic=Counter(country_1 + country_2)
sum_country=list(dic.keys())
t2=time.time()
print(t2-t1)

输出为:
在这里插入图片描述
原文件中仅仅有4W条数据,通过改进的方法,速度提升几十倍

第一个博客,返回来看有点简陋,代码问题很多,各方面都有点不全面。会努力学习,能做到完美的话尽力达到,展现更好的给爱好编程,爱好专研的朋友们。
持续更新。。。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值