Перезаписать данные в кадре данных на основе другого столбца - PullRequest
0 голосов
/ 01 декабря 2019

Предположим, у меня есть CSV-файл с двумя столбцами, один с данными (число) и один с датой в формате '193011'.

У меня есть скрипт / процесс, который генерирует новые данные в форме [data, date]. Я хотел бы код, который делает следующее.

Если date еще не появляется в CSV, то новые данные должны быть добавлены в конец CSV. Это легко, и я знаю, как это сделать.

Если в csv появляется date, тогда я хочу знать это (я уже знаю, как это сделать), и я хотел бы перезаписать данныев строке в CSV, который содержит эту дату. Я не знаю, как сделать эту последнюю часть.

Пока я работаю только с пакетом csv, но я понимаю, что это то, для чего Панды могут быть очень полезны. Открыто для ответов с пандами и без них.

Кроме того, я знаю, что один из подходов, который может сработать, - это просто переписывать csv при каждом добавлении данных, обрабатывая любые строки с тем же значением, что и новое значение date специально, но это не кажется мне хорошим решением.

Edit 1

Вот данные. В основном я делаю эксперимент в определенную дату, и эксперимент выводит данные в файл с именем TEK ####. Csv. Имя файла данных и дата записываются. Затем файл данных обрабатывается для вывода числовых значений в категориях finesse_mean и finesse_err. По разным причинам данные будут обрабатываться повторно, и результатом повторной обработки должно быть перезапись старых данных или добавление к полному набору данных.

mirror_1,mirror_2,finesse_mean,finesse_err,cav_length (mm),date,filename,notes,uid
1,4,12784,None,10,191001,TEK0000.csv,,191001TEK0000.csv
1,4,10058,None,10,191001,TEK0001.csv,,191001TEK0001.csv
1,4,21288,None,8,19`1001,TEK0003.csv,,191001TEK0003.csv
1,4,25843,None,7,191001,TEK0002.csv,,191001TEK0002.csv
5,13,43297,579,3.6,191015,TEK0000.csv,,191015TEK0000.csv
14,15,54531,650,4.75,191022,TEK0000.csv,,191022TEK0000.csv
14,15,80444,542,8.45,191022,TEK0001.csv,,191022TEK0001.csv
14,15,43899,61,8.45,191022,TEK0002.csv,,191022TEK0002.csv
14,15,73906,220,8.45,191022,TEK0003.csv,,191022TEK0003.csv
14,15,83946,306,6,191024,TEK0001.csv,,191024TEK0001.csv
14,15,73607,605,7.85,191024,TEK0002.csv,,191024TEK0002.csv
14,15,84402,611,6,191024,TEK0003.csv,,191024TEK0003.csv
13,15,49706,515,6.26,191029,TEK0000.csv,,191029TEK0000.csv
13,15,65547,403,6.26,191029,TEK0001.csv,,191029TEK0001.csv
13,15,63117,306,6.26,191029,TEK0002.csv,,191029TEK0002.csv
14,15,81584,410,6.14,191101,TEK0000.csv,,191101TEK0000.csv
14,16,19782,269,4.85,191101,TEK0001.csv,,191101TEK0001.csv
14,16,18348,130,5.2,191101,TEK0002.csv,,191101TEK0002.csv
14,15,17038,97,12.75,191104,TEK0000.csv,,191104TEK0000.csv
14,15,16620,43,16.8,191104,TEK0001.csv,,191104TEK0001.csv
14,15,13646,49,18.23,191104,TEK0002.csv,,191104TEK0002.csv
3,15,83146,345,4.15,191107,TEK0000.csv,,191107TEK0000.csv
3,15,69347,477,12,191107,TEK0001.csv,,191107TEK0001.csv
3,15,68372,506,13.75,191107,TEK0002.csv,,191107TEK0002.csv
3,15,67950,582,14.4,191107,TEK0003.csv,,191107TEK0003.csv
3,15,66644,564,15,191107,TEK0004.csv,,191107TEK0004.csv
3,9,22883,197,5.5,191108,TEK0000.csv,,191108TEK0000.csv
3,9,21544,274,8.35,191108,TEK0001.csv,,191108TEK0001.csv
1,9,11474,159,7,191108,TEK0002.csv,,191108TEK0002.csv
3,9,21163,413,7.25,191111,TEK0000.csv,,191111TEK0000.csv
1,8,16949,107,4,191115,TEK0000.csv,,191115TEK0000.csv
1,8,9711,77,9,191115,TEK0001.csv,,191115TEK0001.csv
27,28,44092,481,20,191115,TEK0002.csv,,191115TEK0002.csv
27,28,39812,351,20,191115,TEK0003.csv,,191115TEK0003.csv
27,28,69046,722,20,191115,TEK0004.csv,After Cleaning back mirror,191115TEK0004.csv
27,28,82591,291,20,191115,TEK0005.csv,After Cleaning front mirror,191115TEK0005.csv
27,28,97631,205,12,191119,TEK0004.csv,,191119TEK0004.csv
27,28,99560,408,11,191120,TEK0000.csv,,191120TEK0000.csv
27,28,98735,275,11,191120,TEK0001.csv,,191120TEK0001.csv
27,28,98141,184,11,191120,TEK0002.csv,,191120TEK0002.csv
27,28,103222,222,11,191120,TEK0003.csv,,191120TEK0003.csv
27,28,96684,463,11,191120,TEK0004.csv,,191120TEK0004.csv
27,28,102335,313,11,191120,TEK0005.csv,,191120TEK0005.csv
27,28,102698,311,11,191120,TEK0006.csv,,191120TEK0006.csv
1,8,14469,69,8,191121,TEK0000.csv,,191121TEK0000.csv
1,8,16286,128,5,191121,TEK0001.csv,,191121TEK0001.csv
1,8,16143,64,5,191121,TEK0004.csv,,191121TEK0004.csv
1,7,14272,76,4,191121,TEK0006.csv,,191121TEK0006.csv
1,7,12275,80,4,191121,TEK0007.csv,,191121TEK0007.csv
3,9,13582,61,4.8,191121,TEK0008.csv,,191121TEK0008.csv
14,15,30502,174,5,191122,TEK0000.csv,,191122TEK0000.csv
14,15,44951,152,5,191122,TEK0001.csv,,191122TEK0001.csv
14,15,56137,111,6.7,191122,TEK0002.csv,,191122TEK0002.csv
3,9,14177,55,7,191122,TEK0003.csv,,191122TEK0003.csv
27,28,103871,160,7.75,191122,TEK0004.csv,,191122TEK0004.csv
28,2,54449,1069,3,191122,TEK0005.csv,,191122TEK0005.csv
3,28,79357,653,5.00,191126,TEK0000.csv,,191126TEK0000.csv
9,28,10887,55,4.50,191126,TEK0001.csv,,191126TEK0001.csv
9,28,11435,45,4.50,191126,TEK0002.csv,,191126TEK0002.csv
9,28,21184,70,2.40,191126,TEK0003.csv,,191126TEK0003.csv
3,9,14586,181,4.40,191126,TEK0005.csv,,191126TEK0005.csv
3,9,19954,127,9.80,191126,TEK0006.csv,,191126TEK0006.csv

У меня есть код, который может выполнять то, что я ищутеперь, который я опубликую здесь в ближайшее время.

Предположим, у меня есть новый бит данных в форме:

3, 28, 21352, 122, 7.5, 191127, TEK0001,,191127TEK0001.csv

или старые исправленные данные в форме

3,9,19954,127,9.80,191126,TEK0006.csv,,191126TEK0006.csv

Ответы [ 2 ]

1 голос
/ 02 декабря 2019

Вы можете сделать следующее

1) Создать фрейм данных Pandas (скажем, «df») с первой записью вашего файла с «датой» в качестве индекса и «данными» вашего файла в одном столбце 2) Затем прочитайте запись файла по записи и выполните цикл по следующей логике

если 'date' в df.index:

df = df.drop('date')
df.loc['date'] = data

else

df.loc ['date '] = data

3) В конце экспортируйте данные в файл из фрейма данных

Дайте мне знать, если вам нужно руководство о том, как создать фрейм данных или импортировать или экспортировать файлы. Я могу обновить пост

0 голосов
/ 01 декабря 2019

Вот код, который я написал, который, кажется, делает эту работу. В этом коде я создаю версию файлов, к имени которой добавляется суффикс _temp, и построчно копирую содержимое файла исходного файла в новый файл. Если одна из строк дублирует тот же набор данных текущей области, я ввожу новые данные, в противном случае предыдущие данные просто копируются из старого файла. В конце старый файл удаляется, а новый файл переименовывается в старое имя. Сценарий, кажется, работает нормально, даже если я направляю и csv_reader, и csv_writer в один и тот же файл, но, исходя из прочитанного, он звучит так, что это является возможным рецептом для катастрофы, а новый файл + переименование кажется лучшей практикой

import csv
import os
from pathlib import Path

def csv_write_overwrite(save_file, data_dict, uid_field='uid'):
    temp_file = Path(str(save_file).strip('.csv') + '_temp.csv')
    new_data_uid = data_dict[uid_field]
    data_saved = False
    with open(save_file, 'r', newline='') as read_file:
        csv_reader = csv.DictReader(read_file)
        with open(temp_file, 'w', newline='') as write_file:
            csv_writer = csv.DictWriter(write_file, fieldnames=data_dict.keys())
            csv_writer.writeheader()
            for line in csv_reader:
                if line['uid'] != new_data_uid:
                    csv_writer.writerow(line)
                elif line['uid'] == new_data_uid:
                    csv_writer.writerow(data_dict)
                    data_saved = True
            if not data_saved:
                csv_writer.writerow(data_dict)
    os.remove(save_file)
    os.rename(temp_file, save_file)

Редактировать:

Я обновил код, удалив детали, относящиеся к моей конкретной структуре данных. Теперь все, что требуется, это CSV и структура данных, которая включает в себя поле, которое можно использовать как uid_field.

Вот еще одна более общая версия кода, которая вместо проверки определенного поля uid_field, чтобы определить, дублируют ли новые данные, вы можете передать в пользовательскую функцию duplicate_checking.

def csv_write_overwrite(save_file, data_dict, 
                        is_duplicate=lambda x, y: x['uid'] == y['uid']):
    temp_file = Path(str(save_file).strip('.csv') + '_temp.csv')
    data_saved = False
    with open(save_file, 'r', newline='') as read_file:
        csv_reader = csv.DictReader(read_file)
        with open(temp_file, 'w', newline='') as write_file:
            csv_writer = csv.DictWriter(write_file, fieldnames=data_dict.keys())
            csv_writer.writeheader()
            for line in csv_reader:
                if not is_duplicate(line, data_dict):
                    csv_writer.writerow(line)
                elif is_duplicate(line, data_dict):
                    csv_writer.writerow(data_dict)
                    data_saved = True
            if not data_saved:
                csv_writer.writerow(data_dict)
    os.remove(save_file)
    os.rename(temp_file, save_file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...