#python #pandas
Вопрос:
Я пытаюсь читать в файле .dat, но он состоит из фрагментов данных, не относящихся к столбцам, с заголовками по всему.
Я пробовал читать это в панд:
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