Чтение данных из файла с фиксированной шириной не в тех же местах с помощью Pandas

У меня есть файл журнала с устройства с некоторой информацией для анализа, и я использую Pandas и Python для чтения этого файла для некоторых целей анализа. Итак, давайте предположим, что ниже приведено содержимое файла.

20:03:42.769 0xAA 0x99->0x98 A200000000000000000088DD
20:03:42.769 0x11 0x00->0x00 B2
20:03:42.815 0xAA 0x98->0x99 5203001C0C1C0C0E0E
20:03:42.831 0x11 0x00->0x00 EE
20:03:50.726 0xAA 0x99->0x98 A200000000000000000088DD
20:03:50.819 0xAA 0x99->0x98 A200000000000000000088DD
20:03:50.895 0xAA 0x99->0x98 A200000000000000000088DD
20:03:54.841 0xAA 0x98->0x99 1202
20:03:54.857 0x11 0x00->0x00 E0
20:03:54.935 0xAA 0x99->0x98 120300410102000C070A00
20:03:54.935 0x11 0x00->0x00 AB
20:03:55.013 0xAA 0x99->0x98 120301050000050C000003

И я хочу разделить информацию на отдельные столбцы, как показано ниже.

20:03:42.769 0xAA 0x99->0x98 A2 00 00 00 00 00 00 00 00 00 88 DD
20:03:42.769 0x11 0x00->0x00 B2
20:03:42.815 0xAA 0x98->0x99 52 03 00 1C 0C 1C 0C 0E 0E
20:03:42.831 0x11 0x00->0x00 EE
20:03:50.726 0xAA 0x99->0x98 A2 00 00 00 00 00 00 00 00 00 88 DD
20:03:50.819 0xAA 0x99->0x98 A2 00 00 00 00 00 00 00 00 00 88 DD
20:03:50.895 0xAA 0x99->0x98 A2 00 00 00 00 00 00 00 00 00 88 DD
20:03:54.841 0xAA 0x98->0x99 12 02
20:03:54.857 0x11 0x00->0x00 E0
20:03:54.935 0xAA 0x99->0x98 12 03 00 41 01 02 00 0C 07 0A 00 
20:03:54.935 0x11 0x00->0x00 AB
20:03:55.013 0xAA 0x99->0x98 12 03 01 05 00 00 05 0C 00 00 03 

С помощью pd.read_csv я могу разделить данные, но как разделить последний столбец на фиксированную ширину с 2 символами в каждом столбце, то же самое происходит с pd.read_fwf

           Time Header   Src->Dest                      Data
0  20:03:42.769   0xAA  0x99->0x98  A200000000000000000088DD
1  20:03:42.769   0x11  0x00->0x00                        B2
2  20:03:42.815   0xAA  0x98->0x99        5203001C0C1C0C0E0E
3  20:03:42.831   0x11  0x00->0x00                        EE
4  20:03:50.726   0xAA  0x99->0x98  A200000000000000000088DD

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

Я тоже пытался это сделать.

colspecs = [ (0,12), (13,17), (18,28), (29,31), (31,33) ]
df = pd.read_fwf("SampleLog.txt", colspecs = colspecs, names=["Time", "Header", "Src->Dest", "C1", "C2"])

И я понимаю это.

           Time Header   Src->Dest  C1   C2
0  20:03:42.769   0xAA  0x99->0x98  A2  0.0
1  20:03:42.769   0x11  0x00->0x00  B2  NaN
2  20:03:42.815   0xAA  0x98->0x99  52  3.0
3  20:03:42.831   0x11  0x00->0x00  EE  NaN
4  20:03:50.726   0xAA  0x99->0x98  A2  0.0

Здесь похоже, что это сработает, но проблема в том, что я получаю значения с плавающей запятой в столбце «C2», и я также получу такое же поведение в других столбцах, если добавлю. Причина такого поведения связана с «NaN», который преобразует полный столбец в тип float/double. Я попытался заменить «NaN» на что-то другое, но не смог его использовать. Может ли кто-нибудь помочь мне в решении этой проблемы, с которой я столкнулся?

1
0
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать угадать по умолчанию и проанализировать данные:

df = pd.read_fwf('a.csv', names=["Time", "Header", "Src->Dest", "C1"])
(df.drop('C1', axis=1)
   .join(df['C1'].str.extractall('(.{2})')[0].unstack('match'))
)

Выход:

            Time    Header  Src->Dest   0   1   2   3   4   5   6   7   8   9   10  11
0   20:03:42.769    0xAA    0x99->0x98  A2  00  00  00  00  00  00  00  00  00  88  DD
1   20:03:42.769    0x11    0x00->0x00  B2  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2   20:03:42.815    0xAA    0x98->0x99  52  03  00  1C  0C  1C  0C  0E  0E  NaN NaN NaN
3   20:03:42.831    0x11    0x00->0x00  EE  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4   20:03:50.726    0xAA    0x99->0x98  A2  00  00  00  00  00  00  00  00  00  88  DD
5   20:03:50.819    0xAA    0x99->0x98  A2  00  00  00  00  00  00  00  00  00  88  DD
6   20:03:50.895    0xAA    0x99->0x98  A2  00  00  00  00  00  00  00  00  00  88  DD
7   20:03:54.841    0xAA    0x98->0x99  12  02  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
8   20:03:54.857    0x11    0x00->0x00  E0  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
9   20:03:54.935    0xAA    0x99->0x98  12  03  00  41  01  02  00  0C  07  0A  00  NaN
10  20:03:54.935    0x11    0x00->0x00  AB  NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
11  20:03:55.013    0xAA    0x99->0x98  12  03  01  05  00  00  05  0C  00  00  03  NaN

Другие вопросы по теме