如何以有序的方式存储大量数据?

问题描述 投票:0回答:1

我需要组织大量数据。我认为一个好的解决方案可能是使用熊猫DF然后腌制DF来保存它。只有问题,我仍然不明白熊猫是如何工作的,我不知道在我的数据方面应该考虑什么方法。

数据:((int, int), float, float)形式的列表,但整数的第一个元组可以具有不同的大小。

例1:

[((78, 104), 1.55, 0.25),
((78, 104), 1.56, 0.25),
((78, 104), 1.57, 0.25),
((78, 104), 1.58, 0.25),
((75, 100), 5.02, 0.25),
((75, 100), 5.03, 0.25),
((75, 100), 5.04, 0.25),
((75, 100), 5.05, 0.25),
((78, 104), 1.25, 0.333),
((78, 104), 1.26, 0.333)]

例2:

[((20, 78, 104), 1.55, 0.25),
((20, 78, 104), 1.56, 0.25),
((21, 78, 104), 1.57, 0.25),
((21, 78, 104), 1.58, 0.25),
((18, 75, 100), 5.02, 0.25),
((18, 75, 100), 5.03, 0.25),
((18, 75, 100), 5.04, 0.25),
((18, 75, 100), 5.05, 0.25),
((20, 78, 104), 1.25, 0.333),
((20, 78, 104), 1.26, 0.333)]

这些只是摘录。目前我在.txt文件中写入数据,然后在读取文件时用字符串方法将其解析回来。正如您所看到的,元组可以是很多值(数百或数千)并且具有2或更大的len。

表示此数据的另一种方法是形式字典:Dict[tuple] = ([list of column 1], [list of column 2])

data_dict = dict()
for elt in data_list:
    if elt[0] not in data_dict.keys():
        data_dict[elt[0]] = ([elt[1]], [elt[2]])
    else:
        data_dict[elt[0]][0].append(elt[1])
        data_dict[elt[0]][1].append(elt[2])

例1:

data_list = [((78, 104), 1.55, 0.25), ((78, 104), 1.56, 0.25), ((78, 104), 1.57, 0.25), ((78, 104), 1.58, 0.25),
((75, 100), 5.02, 0.25), ((75, 100), 5.03, 0.25), ((75, 100), 5.04, 0.25), ((75, 100), 5.05, 0.25), ((78, 104), 1.25, 0.333),
((78, 104), 1.26, 0.333)]

Output:
{(78, 104): ([1.55, 1.56, 1.57, 1.58, 1.25, 1.26], [0.25, 0.25, 0.25, 0.25, 0.333, 0.333]), 
(75, 100): ([5.02, 5.03, 5.04, 5.05], [0.25, 0.25, 0.25, 0.25])}

例2:

data_list = [((20, 78, 104), 1.55, 0.25), ((20, 78, 104), 1.56, 0.25), ((21, 78, 104), 1.57, 0.25), ((21, 78, 104), 1.58, 0.25),
((18, 75, 100), 5.02, 0.25), ((18, 75, 100), 5.03, 0.25), ((18, 75, 100), 5.04, 0.25), ((18, 75, 100), 5.05, 0.25), ((20, 78, 104), 1.25, 0.333),
((20, 78, 104), 1.26, 0.333)]

Output:
{(20, 78, 104): ([1.55, 1.56, 1.25, 1.26], [0.25, 0.25, 0.333, 0.333]), 
(21, 78, 104): ([1.57, 1.58], [0.25, 0.25]), 
(18, 75, 100): ([5.02, 5.03, 5.04, 5.05], [0.25, 0.25, 0.25, 0.25])}

将这些数据存储在文件中并以有效的方式访问它的可能方式(以及哪种方法最好)是什么?

组合是:((78, 104), 1.57, 0.25)对于访问部分,我将需要在文件1中查找使用元组(78,104)的组合,然后在文件2中查找使用元组(20,78)的组合。最终目标是找到每个匹配的组合,即文件1中的(78,104)之后的2个值必须与文件2中的(20,78)之后的2个值相同。因此我需要快速访问有趣的组合每个文件。

感谢您提供有关如何表示此数据并存储数据的任何建议,代码和帮助。

如果你要求,我可以把代码存储/读取.txt文件,但我想我们都会同意这不是解决这个问题的最佳方法。

python database pandas
1个回答
1
投票
import pandas as pd
ex_first = [((78, 104), 1.55, 0.25),
    ((78, 104), 1.56, 0.25),
    ((78, 104), 1.57, 0.25),
        ((78, 104), 1.58, 0.25),
    ((75, 100), 5.02, 0.25),
    ((75, 100), 5.03, 0.25),
    ((75, 100), 5.04, 0.25),
    ((75, 100), 5.05, 0.25),
    ((78, 104), 1.25, 0.333),
    ((78, 104), 1.26, 0.333)]

data = pd.DataFrame(ex_first)
data.columns = ["tuple1", "name1", "name2"]
# saving
data.to_csv("DataFrame.csv")

如果你想检索元组是“(78,104)”的值,你可以通过以下方式查看:

In [67]: results = data[data.tuple1==(78, 104)]

In [68]: results
Out[68]: 
  tuple1  name1  name2
0  (78, 104)   1.55  0.250
1  (78, 104)   1.56  0.250
2  (78, 104)   1.57  0.250
3  (78, 104)   1.58  0.250
8  (78, 104)   1.25  0.333
9  (78, 104)   1.26  0.333

如果csv文件很大 - > read how to use chunks

© www.soinside.com 2019 - 2024. All rights reserved.