Excel转Pajek可读文件格式(.net)Python实现
第一次在CSDN写东西,打开界面就喜欢上了,太优秀了。。。
选修过复杂网络课,中间需要将Excel数据转为Pajek或是Gephi可读的文件格式
- 一般Excel数据格式如下
统计国 | 贸易国 | 贸易额 |
---|---|---|
A1 | B1 | 100 |
A2 | B2 | 50 |
A3 | B3 | 80 |
- 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条数据,通过改进的方法,速度提升几十倍
第一个博客,返回来看有点简陋,代码问题很多,各方面都有点不全面。会努力学习,能做到完美的话尽力达到,展现更好的给爱好编程,爱好专研的朋友们。
持续更新。。。