pandas 如何以表格形式排列大列表以避免记忆错误?

ep6jt1vc  于 2023-05-12  发布在  其他
关注(0)|答案(1)|浏览(148)

我有一个输入列表data,如下所示,我想根据字母顺序将其制表,将每个值定位在每行的正确列中。下面的代码可以工作,但是当我有一个大的输入列表(一个data列表有超过10K的子列表,letters列表有大约12个元素)时,我得到MemoryError

import pandas as pd

letters = ['A','B','C']
data = [['C', 3], ['B', 5], ['A', 1], ['B', 4], ['C', 2], ['A', 3], ['C', 8], ['A',9],['B',5]]

out = []
while data:
    out.append([
        data.pop(0)[1] if data and data[0][0] == h else None
        for h in letters
    ]) 

df = pd.DataFrame(out, columns=letters)

输出:

每行都是从data的每个子列表的元素[0][1]构建的。如果找到序列['A','x'], ['B','y'], ['C','z'],则该行将是['x','y','z']。如果子列表是['B','y']['C','z'],那么该行的其他值应该是None。就像输入的data列表是这样的。

list2 = [
          ['A', ''], ['B', ''], ['C', 3 ],
          ['A', ''], ['B', 5 ], ['C', ''],
          ['A', 1 ], ['B', 4 ], ['C', 2 ],
          ['A', 3 ], ['B', ''], ['C', 8 ],
          ['A', 9 ], ['B', 5 ], ['C', '']
        ]

为了避免MemoryError,我尝试创建3个这样的循环,但由于最初我不知道有多少行会有output列表,以便在2或3个循环中分离,以创建3个输出列表。我希望能说得通。谢谢你的帮助

a = []
b = []
c = []

n = len(data)//3

if data:
    for k in range(n):
        a.append([
            data.pop(0)[1] if data[0][0] == h else None
            for h in letters
        ])
4uqofj5v

4uqofj5v1#

您的代码在MemoryError上失败,因为您在循环中弹出列表的第一个元素,不断向左移动所有元素以填充开头差距。
下面是一个不使用pop方法的算法的可能实现,它应该运行得更快,并且没有内存开销:

letters = ['A','B','C']
data = [['C', 3], ['B', 5], ['A', 1], ['B', 4], ['C', 2], ['A', 3], ['C', 8], ['A',9],['B',5]]

out = [[None] * 3]
column = 0 # This variable holds last filled column
for elem in data:
    # Convert the letter to column
    this_column = ord(elem[0]) - ord('A')
    
    # Create new row when new column is less or equal to last column
    if this_column <= column:
        out.append([None] * 3)
    
    # Add new element to the list
    out[-1][this_column] = elem[1]

    # Set column for the next iteration
    column = this_column

df = pd.DataFrame(out, columns=letters)

相关问题