если ваши данные выглядят так:
array = [['PIN: 123 COD: 222 \n', 'LOA: 124 LOC: Sea \n'],
['PIN:456 COD:555 \n', 'LOA:678 LOC:Chi \n']]
Вы можете сделать это:
1 Шаг: используйте регулярные выражения для анализа ваших данных, потому что это строка.
подробнее о reg-exp
raws=list()
for index in range(0,len(array)):
raws.append(re.findall(r'(PIN|COD|LOA|LOC): ?(\w+)', str(array[index])))
Выход:
[[('PIN', '123'), ('COD', '222'), ('LOA', '124'), ('LOC', 'Sea')], [('PIN', '456'), ('COD', '555'), ('LOA', '678'), ('LOC', 'Chi')]]
2 Шаг: извлечение необработанных значений и имен столбцов.
columns = np.array(raws)[0,:,0]
raws = np.array(raws)[:,:,1]
Выход:
сырье -
[['123' '222' '124' 'Sea']
['456' '555' '678' 'Chi']]
столбцы -
['PIN' 'COD' 'LOA' 'LOC']
3 Шаг: Теперь мы можем просто создать df.
df = pd.DataFrame(raws, columns=columns)
Выход:
PIN COD LOA LOC
0 123 222 124 Sea
1 456 555 678 Chi
Это то, что вы хотите?
Надеюсь, это поможет, я не уверен в вашем формате ввода.
И не забывайте импортировать библиотеки! (Я использовал панд как pd, numpy как np, re).
UPD: другой способ Я создал файл журнала, как у вас:
array = open('example.log').readlines()
Выход:
['PIN: 123 COD: 222 \n',
'LOA: 124 LOC: Sea \n',
'PIN: 12 COD: 322 \n',
'LOA: 14 LOC: Se \n']
Затем разделить на '', отбросить '\ n' и изменить форму:
raws = np.array([i.split(' ')[:-1] for i in array]).reshape(2, 4, 2)
При изменении формы первое число - это число необработанных кадров в вашем будущем кадре данных, второе - количество столбцов и последнее - вам не нужно менять. Это не сработает, если у вас нет пробелов между информацией и '\ n' в каждой строке. Если вы этого не сделаете, я изменю пример.
Выход:
array([[['PIN:', '123'],
['COD:', '222'],
['LOA:', '124'],
['LOC:', 'Sea']],
[['PIN:', '12'],
['COD:', '322'],
['LOA:', '14'],
['LOC:', 'Se']]],
dtype='|S4')
А затем возьмите строки и столбцы:
columns = np.array(raws)[:,:,0][0]
raws = np.array(raws)[:,:,1]
Наконец, создайте фрейм данных (и последний символ cat для столбцов):
pd.DataFrame(raws, columns=[i[:-1] for i in columns])
Выход:
PIN COD LOA LOC
0 123 222 124 Sea
1 12 322 14 Se
Если у вас много файлов журналов, вы можете сделать это для каждого цикла for, сохранить каждый массив данных в массиве (например, вызовы массивов DF_array), а затем использовать pd.concat, чтобы сделать один кадр данных из массива данных.
pd.concat(DF_array)
Если вам нужно, я могу добавить пример.
UPD:
Я создал каталог с файлами журналов, а затем создаю массив со всеми файлами из PATH:
PATH = "logs_data/"
files = [PATH + i for i in os.listdir(PATH)]
Затем выполните цикл for, как в последнем обновлении:
dfs = list()
for f in files:
array = open(f).readlines()
raws = np.array([i.split(' ')[:-1] for i in array]).reshape(len(array)/2, 4, 2)
columns = np.array(raws)[:,:,0][0]
raws = np.array(raws)[:,:,1]
df = pd.DataFrame(raws, columns=[i[:-1] for i in columns])
dfs.append(df)
result = pd.concat(dfs)
Выход:
PIN COD LOA LOC
0 123 222 124 Sea
1 12 322 14 Se
2 1 32 4 Ses
0 15673 2324 13464 Sss
1 12452 3122 11234 Se
2 11 132 4 Ses
0 123 222 124 Sea
1 12 322 14 Se
2 1 32 4 Ses