У меня есть CSV-файлы, которые не содержат заголовок, и каждая строка содержит только 2 столбца (время и имя данных), которые всегда содержат данные, остальные строки имеют различное количество столбцов в зависимости от данных.
Я успешно импортировал «нормальные» CSV-файлы в панды с постоянным количеством столбцов. Это работает очень хорошо, но я видел что-нибудь в документах, чтобы справиться с этой текущей ситуацией.
Вот фрагмент файла CSV, о котором идет речь :
1573081480.942000, /eeg, 843.3333, 854.61536, 851.79486, 849.3773, 863.0769
1573081480.942000, /eeg, 844.1392, 857.4359, 849.3773, 861.8681, 890.07324
1573081480.943000, /eeg, 853.8095, 853.8095, 850.989, 866.30035, 854.61536
1573081480.944000, /eeg, 855.42126, 855.0183, 846.1539, 852.1978, 846.9597
1573081480.947000, /eeg, 844.1392, 853.8095, 846.55676, 842.52747, 873.5531
1573081480.947000, /eeg, 848.97437, 853.00366, 851.79486, 853.00366, 856.2271
1573081480.948000, /eeg, 859.0476, 852.6007, 850.18317, 863.8828, 826.0073
1573081480.950000, /eeg, 859.0476, 851.79486, 853.00366, 866.30035, 819.5604
1573081480.950000, /eeg, 851.79486, 852.1978, 846.9597, 854.61536, 859.45056
1573081480.951000, /eeg, 856.63007, 853.00366, 846.55676, 840.9158, 854.21246
1573081480.960000, /elements/alpha_absolute, 0.48463312
1573081480.960000, /elements/beta_absolute, 0.061746284
1573081480.961000, /elements/gamma_absolute, 0.7263172
1573081480.961000, /elements/theta_absolute, 0.7263172
1573081480.961000, /elements/delta_absolute, 0.7263172
Результат, который мне нужен, выглядит примерно так
time, eeg_0, eeg_1, eeg_2, eeg_3, delta, theta, alpha, beta, gamma
1573081480.942000, 844.1392, 857.4359, 849.3773, 861.8681,,,,,
1573081480.947000, 844.1392, 853.8095, 846.55676, 842.52747, 873.5531,,,,,
1573081480.947000, 848.97437, 853.00366, 851.79486, 853.00366, 856.2271,,,,,
1573081480.948000, 859.0476, 852.6007, 850.18317, 863.8828, 826.0073,,,,,
1573081480.960000,,,,,,,0.48463312,,
1573081480.960000,,,,,,,,0.061746284,
1573081480.961000,,,,,0.7263172,,,,
1573081480.961000,,,,,0.52961296,,,
1573081480.962000,,,,,,,,-0.26484978
Как видите, количество значений может меняться в зависимости от хранимых данных.
Мне бы хотелось, чтобыПроцесс импорта должен быть таким же простым и эффективным, как и с «обычными» CSV-файлами.
Это то, чего я надеялся избежать, оно ужасно многословно и неэффективно:
d = {
'time': [0.],
'eeg0': [0.],'eeg1': [0.],'eeg2': [0.],'eeg3': [0.],'eeg4': [0.],
'delta_absolute': [0.], 'theta_absolute': [0], 'alpha_absolute': [0], 'beta_absolute': [0], 'alpha_absolute': [0],
'acc0': [0], 'acc1': [0], 'acc2': [0], 'gyro0': [0], 'gyro1': [0], 'gyro2': [0],
'concentration': [0],'mellow': [0]
}
df_new_data = pd.DataFrame(data=d)
csvfile = open(fname)
csv_reader = csv.reader(csvfile, delimiter=',')
csv_data = list(csv_reader)
row_count = len(csv_data)
for row in csv_data:
if row[1] == ' /muse/acc':
df_new_data = df_new_data.append({'acc0' : row[2], 'acc1' : row[3], 'acc2' : row[4]}, ignore_index=True)
if row[1] == ' /muse/gyro':
df_new_data = df_new_data.append({'gyro0' : row[2], 'gyro1' : row[3], 'gyro2' : row[4]}, ignore_index=True)
РЕДАКТИРОВАТЬ:
Я обнаружил, что еслипервая строка CSV-файла содержит меньше полей, любые последующие строки, тогда read_csv () завершится с ошибкой. Приведенный выше пример данных CSV работает, но этот не работает:
573081480.960000, /elements/alpha_absolute, 0.48463312
1573081480.960000, /elements/beta_absolute, 0.061746284
1573081480.961000, /elements/gamma_absolute, 0.7263172
1573081480.961000, /elements/theta_absolute, 0.7263172
1573081480.961000, /elements/delta_absolute, 0.7263172
1573081480.942000, /eeg, 843.3333, 854.61536, 851.79486, 849.3773, 863.0769
1573081480.942000, /eeg, 844.1392, 857.4359, 849.3773, 861.8681, 890.07324
1573081480.943000, /eeg, 853.8095, 853.8095, 850.989, 866.30035, 854.61536
1573081480.944000, /eeg, 855.42126, 855.0183, 846.1539, 852.1978, 846.9597
1573081480.947000, /eeg, 844.1392, 853.8095, 846.55676, 842.52747, 873.5531
1573081480.947000, /eeg, 848.97437, 853.00366, 851.79486, 853.00366, 856.2271
1573081480.948000, /eeg, 859.0476, 852.6007, 850.18317, 863.8828, 826.0073
1573081480.950000, /eeg, 859.0476, 851.79486, 853.00366, 866.30035, 819.5604
1573081480.950000, /eeg, 851.79486, 852.1978, 846.9597, 854.61536, 859.45056
1573081480.951000, /eeg, 856.63007, 853.00366, 846.55676, 840.9158, 854.21246
pandas выдаст эту ошибку:
pandas.errors.ParserError: Error tokenizing data. C error: Expected 3 fields in line 6, saw 7
Заранее спасибо!