2017-12-16 3 views
0

Entschuldigung, wenn dies auf eine andere Art und Weise gefragt wurde, bin ich mir nicht sicher, wie ich es sonst tun könnte, um zu bekommen, was ich tun möchte.Stapelsäulen von Pandas Dataframe

sagen, dass ich einige Datenrahmen mit zwei Spalten von Werten haben:

import pandas as pd 

data = {'col1':[0.6, 0.8, 0.9, 0.87, 0.69, 0.88], 
     'col2':[0.72, 0.91, 0.83, 0.85, 0.96, 0.76]} 

df = pd.DataFrame(data) 

df 
Out[1]: 
    col1 col2 
0 0.60 0.72 
1 0.80 0.91 
2 0.90 0.83 
3 0.87 0.85 
4 0.69 0.96 
5 0.88 0.76 

I Spalte nehmen wollen 2 und ‚anhängen‘ es unter Spalte 1, den Index von 6 bis 11 weiterhin auch ich möchte neue 'identifier' Spalte, die erstellt werden soll, um den Spaltennamen zu haben, zu dem jeder Datenpunkt gehört. Die nächstgelegene ich dies ohne viel Spaghetti-Code erhalten kann, ist die folgende:

pd.DataFrame(df.stack()).reset_index() 

Out[34]: 
    level_0 level_1  0 
0   0 col1 0.60 
1   0 col2 0.72 
2   1 col1 0.80 
3   1 col2 0.91 
4   2 col1 0.90 
5   2 col2 0.83 
6   3 col1 0.87 
7   3 col2 0.85 
8   4 col1 0.69 
9   4 col2 0.96 
10  5 col1 0.88 
11  5 col2 0.76 

Ich will nicht diese ‚level_0‘, ‚level_1‘ gekennzeichnet werden, usw., wie ich im Sinn Spaltennamen haben, dass Ich würde gerne verwenden.

Ich bin sicher, es gibt eine einfache und professionelle Möglichkeit, dies zu erreichen, aber ich weiß nicht genug darüber.

Antwort

2

Sie sind wirklich in der Nähe, nicht notwendig Anruf DataFrame Konstruktor.

Auch für Satz Spaltennamen sind möglich Umbenennungsebene MultiIndex von rename_axis:

df = df.stack().rename_axis(('a', 'b')).reset_index(name='val') 
print (df) 
    a  b val 
0 0 col1 0.60 
1 0 col2 0.72 
2 1 col1 0.80 
3 1 col2 0.91 
4 2 col1 0.90 
5 2 col2 0.83 
6 3 col1 0.87 
7 3 col2 0.85 
8 4 col1 0.69 
9 4 col2 0.96 
10 5 col1 0.88 
11 5 col2 0.76 

Numpy Alternative:

a = np.repeat(df.index, len(df.columns)) 
b = np.tile(df.columns, len(df.index)) 
c = df.values.ravel() 

df = pd.DataFrame(np.column_stack([a,b,c]), columns=['a','b','c']) 
print (df) 
    a  b  c 
0 0 col1 0.6 
1 0 col2 0.72 
2 1 col1 0.8 
3 1 col2 0.91 
4 2 col1 0.9 
5 2 col2 0.83 
6 3 col1 0.87 
7 3 col2 0.85 
8 4 col1 0.69 
9 4 col2 0.96 
10 5 col1 0.88 
11 5 col2 0.76