将列表列表转换为结构化的熊猫数据框

时间:2018-08-31 13:52:51

标签: python pandas dataframe preprocessor

我正在尝试转换以下数据结构;

Original structure

为以下python 3中的格式;

Output structure

1 个答案:

答案 0 :(得分:1)

如果您的数据如下:

array = [['PIN: 123 COD: 222 \n', 'LOA: 124 LOC: Sea \n'],
        ['PIN:456 COD:555 \n', 'LOA:678 LOC:Chi \n']]

您可以这样做:

1步骤:使用正则表达式来解析您的数据,因为它是字符串。

see more about 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

是您想要的吗?

希望对您有所帮助,我不确定您的输入格式。

别忘了导入库! (我将pandas用作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)

在重塑中,第一个数字是您将来的数据帧中的原始计数,第二个-列数,最后一个-您无需更改。如果您在每个原始文件中的info和'\ 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]

最后,创建数据框(列的最后一个符号):

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)]

然后像上一次更新一样进行循环:

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