Прочитайте файл .dat с заголовками по всему

#python #pandas

Вопрос:

Я пытаюсь читать в файле .dat, но он состоит из фрагментов данных, не относящихся к столбцам, с заголовками по всему.

данные, открытые в Excel

Я пробовал читать это в панд:

 new_df = pd.read_csv(os.path.join(pathname, item), delimiter='t', skiprows = 2)  

И это услужливо получается вот так:

 Cyclic Acquisition Unnamed: 1 Unnamed: 2 24290-15 Y Unnamed: 4  0 Stored at: 100 cycle NaN NaN  1 Points: 2 NaN NaN NaN  2 Ch 2 Displacement Ch 2 Force Time Ch 2 Count NaN  3 in lbf s segments NaN  4 -0.036677472 -149.27879 19.976563 198 NaN  5 0.031659406 149.65636 20.077148 199 NaN  6 Cyclic Acquisition NaN NaN 24290-15 Y NaN  7 Stored at: 200 cycle NaN NaN  8 Points: 2 NaN NaN NaN  9 Ch 2 Displacement Ch 2 Force Time Ch 2 Count NaN  10 in lbf s segments NaN  11 -0.036623772 -149.73801 39.975586 398 NaN  12 0.031438459 149.48193 40.078125 399 NaN  13 Cyclic Acquisition NaN NaN 24290-15 Y NaN  14 Stored at: 300 cycle NaN NaN   

Нужно ли мне прибегать к .genfromtext() или для этого есть панда-риффический способ?

Комментарии:

1. Это какие-то сумасшедшие данные.

Ответ №1:

Я разработал обходной путь. Мне нужны были пары данных о перемещении, а также некоторые данные, которые все делились равномерно на 100.

Чтобы получить данные о перемещении, я сначала сделал вид, что «Циклическое получение» было допустимым именем столбца, заставил ошибки в значениях быть числовыми и заставил включенные значения быть только теми, которые соответствуют числам:

 displacement = new_df['Cyclic Acquisition'][pd.to_numeric(new_df['Cyclic Acquisition'], errors='coerce').notnull()]   4 -0.036677472 5 0.031659406 11 -0.036623772 12 0.031438459  

Затем, поскольку оставшиеся фрагменты были сопряжены с низкими и высокими значениями, которые необходимо было обрабатывать вместе, я выбрал все остальные значения для «низких» значений, начиная с 0-го значения, и ту же логику для «высоких» значений. Я сбросил индекс, потому что мой план состоял в том, чтобы создать другой фрейм данных с необходимой информацией в нем, и я хотел, чтобы он сохранял значения в соответствующих отношениях друг с другом.

 displacement_low = displacement[::2].reset_index(drop = True)  0 -0.036677472 1 -0.036623772   displacement_high = displacement[1::2].reset_index(drop = True)  0 0.031659406 1 0.031438459  

Затем, чтобы получить циклы, я следовал тому же основному принципу, чтобы свести этот столбец к простым числам, затем я поместил значения в список и использовал понимание списка, чтобы потребовать делимости, и переключил его обратно на серию.

 cycles = new_df['Unnamed: 1'][pd.to_numeric(new_df['Unnamed: 1'], errors='coerce').notnull()].astype('float').tolist()  [100.0, 2.0, -149.27879, 149.65636, 200.0, 2.0, -149.73801, 149.48193...]   cycles = pd.Series([val for val in cycles if val0 == 0])  0 100.0 1 200.0 ...  

Затем я создал новый df с этими данными и назвал столбцы по желанию:

 df = pd.concat([displacement_low, displacement_high, cycles], axis = 1) df.columns = ['low', 'high', 'cycles']   low high cycles 0 -0.036677 0.031659 100.0 1 -0.036624 0.031438 200.0