Я хочу добавить данные (словари) в словарь, где каждый добавленный словарь представляет новую строку.Это итеративный процесс, и неизвестно, какие имена столбцов может иметь новый добавленный словарь (строка).В конце концов, я хочу информационный фрейм панд.Кроме того, я должен записывать кадр данных каждые 1500 строк в файл (что является проблемой, потому что после 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] })#