2017-03-31 5 views
1

das ist mein Datenrahmen:verschmelzenden Spalte, wenn Spaltennamen eine ganze Zahl

A B  1 2 5 

1 1  26 5 5  
2 6  4  2 2  
2 3  8  7 7  
2 4  3 10 19 

Also hier kann man sehen, dass Spalten ‚A‘ ‚B‘ ‚1‘ ‚2‘ ‚5‘ sind Ich möchte Erstellen Sie eine Funktion, die ein Argument als int akzeptiert und dann ein neues Datenframe mit 'A' 'B' Spalten und Spalten erstellt, das als Argument übergeben wurde. also würde es so gehen, aber ich bin nicht sicher, wie man die Spalte erhält, wenn sein Name ein Int irgendwelche Ideen ist? Dank !:

def merge(arg): 
    new_df=pd.concat([df.A, df.B, df.arg], axis=1) 
merge(5) 

A B  5 

1 1  5 
2 6  2 
2 3  7 
2 4  19 

Antwort

2

Simpliest Lösung wird durch Teilmenge mit copy Auswahl:

def merge(arg): 
    return df[['A', 'B', str(arg)]].copy() 

print (merge(5)) 
    A B 5 
0 1 1 5 
1 2 6 2 
2 2 3 7 
3 2 4 19 

Lösungen mit concat wenn Spalte str nur str konvertieren - funktioniert gut, aber slowier:

def merge(arg): 
    return pd.concat([df.A, df.B, df[str(arg)]], axis=1) 

print (merge(5)) 
    A B 5 
0 1 1 5 
1 2 6 2 
2 2 3 7 
3 2 4 19 

Wenn int:

def merge(arg): 
    return pd.concat([df.A, df.B, df[arg]], axis=1) 

print (merge(5)) 
    A B 5 
0 1 1 5 
1 2 6 2 
2 2 3 7 
3 2 4 19 
1
def merge(arg): 
    return df.loc[:, ['A', 'B', str(arg)]] 

merge(2) 

    A B 2 
0 1 1 5 
1 2 6 2 
2 2 3 7 
3 2 4 10 

Sie auch if/else Logik eindringen kann, um es robuster

def merge(arg): 
    arg = arg if arg in df.columns else str(arg) 
    return df.loc[:, ['A', 'B', arg]] 

print(merge(2)) 

    A B 2 
0 1 1 5 
1 2 6 2 
2 2 3 7 
3 2 4 10 

Oder mit ein wenig cleveren Kreuzung

def merge(arg): 
    cols = df.columns.intersection(['A', 'B', arg, str(arg)]) 
    return df.loc[:, cols] 

print(merge(2)) 

    A B 2 
0 1 1 5 
1 2 6 2 
2 2 3 7 
3 2 4 10 
Verwandte Themen