2016-06-24 18 views
1

Ich bin auf der Suche nach einer Möglichkeit, um meine Dataframe Spalten als Zeilen zu konvertieren. Im Anschluss an meinem Beispiel Datenrahmen:Pandas Datenrahmen konvertieren Spalten als Zeilen

mylist= [['xx'], [None, 'yy'], ['xx', None], ['xx',None],['xx','yy']] 

pd.DataFrame(mylist,index=['A','B','C','D','E'],columns=['Col1','Col2']) 

Eingangsdatenrahmen:

------------------- 
Ind | Col1 | Col2 | 
------------------- 
A | xx | None | 
B | None | yy | 
C | xx | None | 
D | xx | None | 
E | xx | yy | 
------------------- 

ich meine Spalten als separate Zeilen in dem Datenrahmen geteilt werden soll. Im Folgenden sehen Sie, wie meine gewünschte Ausgabe aussieht. Kann jemand vorschlagen, wie man das folgende erreicht.

Gewünschte Datenrahmen:

------------------------ 
Ind | Values | Columns | 
------------------------ 
A | xx  | Col1 | 
B | yy  | Col2 | 
C | xx  | Col1 | 
D | xx  | Col1 | 
E | xx  | Col1 | 
E | xx  | Col2 | 
------------------------ 

Danke,
Rtut

Antwort

3

Eine weitere Option ist die Verwendung melt:

longDf = pd.melt(df.reset_index(), id_vars=['index'], var_name=['Columns']) 
longDf[pd.notnull(longDf.value)] 

    index Columns value 
0 A Col1 xx 
2 C Col1 xx 
3 D Col1 xx 
4 E Col1 xx 
6 B Col2 yy 
9 E Col2 yy 
+0

Das ist genial! – bernie

+0

@bernie Danke. 'stack()' ist auch eine gute Möglichkeit, es zu tun. – Psidom

2
df = pd.DataFrame(mylist,index=['A','B','C','D','E'],columns=['Col1','Col2']) 
# rotate df 
stacked_df = pd.DataFrame(df.stack().reset_index()) 
# name columns 
stacked_df.columns = ['Ind','Columns','Values'] 
# reorder columns 
reordered_df = pd.DataFrame(stacked_df,columns=['Ind','Values','Columns']) 

Ergebnisse in:

>>> reordered_df 
    Ind Values Columns 
0 A  xx Col1 
1 B  yy Col2 
2 C  xx Col1 
3 D  xx Col1 
4 E  xx Col1 
5 E  yy Col2 
1

Im Fall von zwei Werten scheint es, dass nur der erste gewünscht wird (z. die letzte Zeile Ihres Beispiels).

Sie können loc verwenden, um den zweiten Wert zuerst auf None zu setzen, wenn beide Spalten Werte haben.

df.loc[(df.Col1.notnull()) & (df.Col2.notnull()), 'Col2'] = None 

Sie können dann melt Ihre Ergebnisse.

>>> pd.melt(df.reset_index(), id_vars='index', var_name='Columns', value_name='Values' 
      ).dropna().set_index('index')[['Values', 'Columns']] 

     Values Columns 
index    
A   xx Col1 
C   xx Col1 
D   xx Col1 
E   xx Col1 
B   yy Col2 
Verwandte Themen