Преобразование списка списков в структурированный пандас - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь преобразовать следующую структуру данных;

Original structure

в формате ниже в Python 3;

Output structure

1 Ответ

0 голосов
/ 31 августа 2018

если ваши данные выглядят так:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...