2017-03-23 1 views
1

に列に基づいて、列の名前を変更するデータフレーム、df考えてみましょう:私は、複数のStatusの列を使用していますcsvからこれを読んでパンダは左

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 

を。パンダは自然にインデックスを付けます。

Status列の左側の列を使用してStatus列の名前を変更したいとします。検査から、私は順序が維持され、左の列が常に適切であると信じています。

所望の出力:

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 

答えて

1

を使用できmaskffill(それは、唯一のSeriesで動作しますので、必要に応じて変換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 

numpy.whereshiftのもう一つの解決策:

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

パンダ提供のrenameメソッドを使用できます。 例:

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