2017-09-22 13 views
2

Ich habe eine Datentabelle wie folgt aus:Pandas Datenrahmen verschmelzen 2 Spalten

Run, test1, test2 
1, 100, 102. 
2, 110, 100. 
3, 108, 105. 

Ich möchte die zwei Spalten wie folgt zusammengeführt haben:

Run, results 
1, 100 
1, 102 
2, 110 
2, 100 
3, 108 
3, 105 

Wie mache ich es in Pandas? Danke vielmals!

Antwort

2

Verwenden stack mit Multiindex Spalte durch doppelte reset_index:

df = df.set_index('Run').stack().reset_index(drop=True, level=1).reset_index(name='results') 
print (df) 
    Run results 
0 1 100.0 
1 1 102.0 
2 2 110.0 
3 2 100.0 
4 3 108.0 
5 3 105.0 

Oder melt:

df = df.melt('Run', value_name='results').drop('variable', axis=1).sort_values('Run') 
print (df) 
    Run results 
0 1 100.0 
3 1 102.0 
1 2 110.0 
4 2 100.0 
2 3 108.0 
5 3 105.0 

Numpy Lösung mit numpy.repeat:

a = np.repeat(df['Run'].values, 2) 
b = df[['test1','test2']].values.flatten() 

df = pd.DataFrame({'Run':a , 'results': b}, columns=['Run','results']) 
print (df) 
    Run results 
0 1 100.0 
1 1 102.0 
2 2 110.0 
3 2 100.0 
4 3 108.0 
5 3 105.0 
2

Dieses, wie ich erreichen diese

Option 1

wide_to_long

pd.wide_to_long(df,stubnames='test',i='Run',j='LOL').reset_index().drop('LOL',1) 
Out[776]: 
    Run test 
0 1 100.0 
1 2 110.0 
2 3 108.0 
3 1 102.0 
4 2 100.0 
5 3 105.0 

Hinweis: Hier habe ich nicht die Spaltennamen von Test zu Ergebnissen ändern, denke ich, von Test als neue Spaltennamen in Ihrer Situation besser sind.


Option 2

pd.concat 

df=df.set_index('Run') 
pd.concat([df[Col] for Col in df.columns],axis=0).reset_index().rename(columns={0:'results'}) 

Out[786]: 
    Run results 
0 1 100.0 
1 2 110.0 
2 3 108.0 
3 1 102.0 
4 2 100.0 
5 3 105.0 
Verwandte Themen