ZJAY
ZJAY

Reputation: 2807

Convert list to dataframe

I am running a loop that appends three fields. Predictfinal is a list, though it is not necessary that it should be a list.

    predictfinal.append(y_hat_orig[0])
    predictfinal.append(mape)
    predictfinal.append(length)

At the end, predictfinal returns a long list. But I really want to conform the list into a Dataframe, where each row is 3 columns. However the list does not designate between the 3 columns, it's just a long list with commas in between. Somehow I am trying to slice predictfinal into 3 columns and a Dataframe from currnet unstructured list - any help how?

predictfinal
Out[88]: 
[1433.0459967608983,
 1.6407741379111223,
 23,
 1433.6389125340916,
 1.6474721044455922,
 22,
 1433.867408791692,
 1.6756763089082383,
 21,
 1433.8484984008207,
 1.6457581105556003,
 20,
 1433.6340460965778,
 1.6380908467895527,
 19,
 1437.0294365907992,
 1.6147672264908473,
 18,
 1439.7485102740507,
 1.5010415925555876,
 17,
 1440.950406295299,
 1.433891246672529,
 16,
 1434.837060644701,
 1.5252803314930383,
 15,
 1434.9716303636983,
 1.6125952442799232,
 14,
 1441.3153523102953,
 3.2633984339696185,
 13,
 1435.6932462859334,
 3.2703435261200497,
 12,
 1419.9057834496082,
 1.9100005818319687,
 11,
 1426.0739741342488,
 1.947684057178654,
 10]

Upvotes: 2

Views: 215

Answers (3)

BENY
BENY

Reputation: 323226

Here is a pandas solution

s=pd.Series(l)
s.index=pd.MultiIndex.from_product([range(len(l)//3),['origin','map','len']])
s=s.unstack()
Out[268]: 
     len       map       origin
0   23.0  1.640774  1433.045997
1   22.0  1.647472  1433.638913
2   21.0  1.675676  1433.867409
3   20.0  1.645758  1433.848498
4   19.0  1.638091  1433.634046
5   18.0  1.614767  1437.029437
6   17.0  1.501042  1439.748510
7   16.0  1.433891  1440.950406
8   15.0  1.525280  1434.837061
9   14.0  1.612595  1434.971630
10  13.0  3.263398  1441.315352
11  12.0  3.270344  1435.693246
12  11.0  1.910001  1419.905783
13  10.0  1.947684  1426.073974

Upvotes: 0

N. Arunoprayoch
N. Arunoprayoch

Reputation: 942

Based on https://stackoverflow.com/a/48347320/6926444

We can achieve it by using zip() and iter(). The code below iterates three elements each time.

res = pd.DataFrame(list(zip(*([iter(data)] * 3))), columns=['a', 'b', 'c'])

Result:

            a         b    c
0   1433.045997  1.640774  23
1   1433.638913  1.647472  22
2   1433.867409  1.675676  21
3   1433.848498  1.645758  20
4   1433.634046  1.638091  19
5   1437.029437  1.614767  18
6   1439.748510  1.501042  17
7   1440.950406  1.433891  16
8   1434.837061  1.525280  15
9   1434.971630  1.612595  14
10  1441.315352  3.263398  13
11  1435.693246  3.270344  12
12  1419.905783  1.910001  11
13  1426.073974  1.947684  10

Upvotes: 2

Quang Hoang
Quang Hoang

Reputation: 150735

You could do:

pd.DataFrame(np.array(predictfinal).reshape(-1,3), columns=['origin', 'mape', 'length'])

Output:

         origin      mape  length
0   1433.045997  1.640774    23.0
1   1433.638913  1.647472    22.0
2   1433.867409  1.675676    21.0
3   1433.848498  1.645758    20.0
4   1433.634046  1.638091    19.0
5   1437.029437  1.614767    18.0
6   1439.748510  1.501042    17.0
7   1440.950406  1.433891    16.0
8   1434.837061  1.525280    15.0
9   1434.971630  1.612595    14.0
10  1441.315352  3.263398    13.0
11  1435.693246  3.270344    12.0
12  1419.905783  1.910001    11.0
13  1426.073974  1.947684    10.0

Or you can also modify your loop:

predictfinal = []

for i in some_list:
    predictfinal.append([y_hat_orig[0], mape, length])

# output dataframe
pd.DataFrame(predictfinal, columns=['origin', 'mape', 'length'])

Upvotes: 1

Related Questions