Python:向dict/datafram添加具有不同列名的行

2024-10-01 07:14:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将数据(字典)添加到字典中,其中每个添加的字典代表一个新行。这是一个迭代过程,不知道新添加的字典(row)可能有哪些列名。最后我想要一个熊猫数据帧。此外,我必须每1500行将dataframe写入一个文件(这是一个问题,因为在1500行之后,当然可能会添加新的数据,其中的列在已写入文件的1500行中不存在)。你知道吗

我需要一个非常快的方法(也许每行26毫秒)。我的方法很慢,因为它必须检查每个数据是否有新的列名,最后必须重新读取文件,以创建一个所有列长度相同的新文件。数据来自在另一个进程中处理的队列。你知道吗

import pandas as pd
def writingData(exportFullName='path', buffer=1500, maxFiles=150000, writingQueue):
    imagePassed = 0
    with open(exportFullName, 'a') as f:
        columnNamesAllList = []
        columnNamesAllSet = set()
        dfTempAll = pd.DataFrame(index=range(buffer), columns=columnNamesAllList)
        columnNamesUpdated = False
        for data in iter(writingQueue.get, "STOP"):
            print(imagesPassed)
            dfTemp = pd.DataFrame([data],index=[imagesPassed])
            if set(dfTemp).difference(columnNamesAllSet):
                columnNamesAllSet.update(set(dfTemp))
                columnNamesAllList.extend(list(dfTemp))
                columnNamesUpdated = True
            else:
                columnNamesUpdated = False
            if columnNamesUpdated:
                print('Updated')
                dfTempAll = dfTemp.combine_first(dfTempAll)
            else:
                dfTempAll.iloc[imagesPassed - 1] = dfTemp.iloc[0]

            imagesPassed += 1

            if imagesPassed == buffer:
                dfTempAll.dropna(how='all', inplace=True)
                dfTempAll.to_csv(f, sep='\t', header=True)
                dfTempAll = pd.DataFrame(index=range(buffer), columns=columnNamesAllList)  
                imagePassed = 0

再读一遍:

    dfTempAll = pd.DataFrame( index=range(maxFiles), columns=columnNamesAllList)
    for number, chunk in enumerate(pd.read_csv(exportFullName, delimiter='\t', chunksize=buffer, low_memory=True, memory_map=True,engine='c')):
        dfTempAll.iloc[number*buffer:(number+1*buffer)] = pd.concat([chunk, columnNamesAllList]).values#.to_csv(f, sep='\t', header=False)  # , chunksize=buffer
        #dfTempAll = pd.concat([chunk, dfTempAll])
    dfTempAll.reset_index(drop=True, inplace=True).to_csv(exportFullName, sep='\t', header=True)

带有数据帧的小示例

所以要说清楚。假设我有一个已经存在的4行数据帧(在实际情况中,它可能有150000行,如上面的代码所示),其中2行已经填充了数据,我添加了一个新行,它可能看起来像这样,但新数据是原始输入中的字典:

df1 = pd.DataFrame(index=range(4),columns=['A','B','D'], data={'A': [1, 2, 'NaN', 'NaN'], 'B': [3, 4,'NaN', 'NaN'],'D': [3, 4,'NaN', 'NaN']})
df2 = pd.DataFrame(index=[2],columns=['A','C','B'], data={'A': [0], 'B': [0],'C': [0] })#

Tags: columns文件数据truedataframeindex字典buffer