2017-03-23 4 views
1

einen Datenrahmen Betrachten df:Pandas umbenennen Spalte basierend auf Spalte auf der linken Seite

Metric_a Status.1 Metric_b Status.2, Metric_c, Status.3 
10  kg  11  mg  15  ml 
12  kg  21  mg  25  ml 
130  kg  41  mg  35  ml 

Ich lese diese aus einem csv in die mehrere Status Spalten verwendet. Pandas indexieren diese natürlich.

Ich möchte die Spalte links von jeder Status Spalte verwenden, um die Status Spalte umzubenennen. Von der Inspektion glaube ich, dass Ordnung aufrechterhalten wird und dass die Säule zur Linken immer passend ist.

gewünschte Ausgabe:

Metric_a Status_Metric_a Metric_b Status_Metric_b Metric_c, Status_Metric_c 
    10  kg  11  mg  15  ml 
    12  kg  21  mg  25  ml 
    130  kg  41  mg  35  ml 

Antwort

1

können Sie verwenden mask und ffill (es funktioniert nur mit Series, ist so notwendig convert indexto_series):

a = df.columns.to_series() 
mask = a.str.contains('Status') 
df.columns = a.mask(mask, 'Status_' + a.mask(mask).ffill()) 
print (df) 
    Metric_a Status_Metric_a Metric_b Status_Metric_b Metric_c \ 
0  10    kg  11    mg  15 
1  12    kg  21    mg  25 
2  130    kg  41    mg  35 

    Status_Metric_c 
0    ml 
1    ml 
2    ml 

Eine andere Lösung mit numpy.where und shift:

a = df.columns.to_series() 
df.columns = np.where(a.str.contains('Status'), 'Status_' + a.shift(), a) 
print (df) 
    Metric_a Status_Metric_a Metric_b Status_Metric_b Metric_c \ 
0  10    kg  11    mg  15 
1  12    kg  21    mg  25 
2  130    kg  41    mg  35 

    Status_Metric_c 
0    ml 
1    ml 
2    ml 
0

Sie können die rename Methode Pandas verwenden. Zum Beispiel:

df.rename(columns={'Status.1': 'Status_Metric_a'}, inplace=True) 
Verwandte Themen