问题:
在项目中,需从待分析的数据中选出最大的前几名,但由于数据量太大,直接排序会内存报错,因此尝试用多路归并的思路来解决问题。
①接口:一个目录下有x个已排序好的csv
最后是为了输出前n名
for i in os.listdir(name):
csv_name = os.path.join(name,i)
temp_files.append(csv_name)
temp_dict = {}
month_result = {}
count = 0
for i in month_file:
temp = pd.read_csv(i,header=None)
temp_dict[count] = temp.head(n)
count += 1
panel = pd.Panel.from_dict(temp_dict,orient = 'minor')
k = len(temp_dict)
rank_list = []
rank_deep = []
for i in range(k):
rank_list.append(int(panel[1][:1][i]))
while n:
a = rank_list.index(max(rank_list))
e = panel[0][a][collections.Counter(rank_deep)[a]]
f = [panel[1][a][collections.Counter(rank_deep)[a]]]
temp_result[e] = f
rank_deep.append(a)
try:
b = int(panel[1][a][collections.Counter(rank_deep)[a]])
except:
b = 0
del rank_list[a]
rank_list.insert(a,b)
n -= 1
思路:
最后需要前n名,所以每个csv之需取前n名,循环n次
①n个排好的csv取前n名:
不知道有多少个,所以遍历比较方便。在学pandas所以放在 三维的结构中 panel:
panel = pd.Panel.from_dict(temp_dict,orient = 'minor' )
②在panel中取每个csv的最大值,放在列表rank_list中:
k = len(temp_dict)
for i in range(k):
rank_list.append(int(panel[1][:1][i]))
③找出rank_list中最大值,找到它是第几个csv中的
a = rank_list.index(max(rank_list))
④需要指针的时候到了,python没有,要找个可以代替指针功能的,由于x随着输入文件的变化而变化,所以指针的个数不能写死;我的想法是设一个列表rank_deep,第③步中找到最大值是第i个csv中的,就append(i),用rank_deep中i的个数来作为第i个csv的指针。然后将第③步找的最大的值及其索引写入字典temp_result中。
e = panel[0][a][collections.Counter(rank_deep)[a]]
f = [panel[1][a][collections.Counter(rank_deep)[a]]]
temp_result[e] = f
rank_deep.append(a)
⑤去旧迎新
try:
b = int(panel[1][a][collections.Counter(rank_deep)[a]])
except:
b = 0
del rank_list[a]
rank_list(a,b)
小结:
现在刚实习,遇到问题就是走一步算一步,用的笨办法,之后要看看有没有聪明的办法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)