Obtenga el nombre de la columna donde valor es algo en el dataframe pandas

Estoy tratando de encontrar, en cada marca de tiempo, el nombre de la columna en un dataframe para el cual el valor coincide con el de una serie temporal en la misma marca de tiempo.

Aquí está mi dataframe:

>>> df col5 col4 col3 col2 col1 1979-01-01 00:00:00 1181.220328 912.154923 648.848635 390.986156 138.185861 1979-01-01 06:00:00 1190.724461 920.767974 657.099560 399.395338 147.761352 1979-01-01 12:00:00 1193.414510 918.121482 648.558837 384.632475 126.254342 1979-01-01 18:00:00 1171.670276 897.585930 629.201469 366.652033 109.545607 1979-01-02 00:00:00 1168.892579 900.375126 638.377583 382.584568 132.998706 >>> df.to_dict() {'col4': {: 920.76797370744271, : 912.15492332839756, : 897.58592995700656, : 918.1214819496729}, 'col5': {: 1190.7244605667831, : 1181.2203275146587, : 1171.6702763228691, : 1193.4145103184442}, 'col2': {: 399.39533771666561, : 390.98615646597591, : 366.65203285812231, : 384.63247469269874}, 'col3': {: 657.09956023625466, : 648.84863460462293, : 629.20146872682449, : 648.55883747413225}, 'col1': {: 147.7613518219286, : 138.18586102094068, : 109.54560722575859, : 126.25434189361377}} 

Y las series de tiempo con valores que quiero hacer coincidir en cada marca de tiempo:

 >>> ts 1979-01-01 00:00:00 1181.220328 1979-01-01 06:00:00 657.099560 1979-01-01 12:00:00 126.254342 1979-01-01 18:00:00 109.545607 Freq: 6H >>> ts.to_dict() {: 657.09956023625466, : 1181.2203275146587, : 109.54560722575859, : 126.25434189361377} 

Entonces el resultado sería:

 >>> df_result value Column 1979-01-01 00:00:00 1181.220328 col5 1979-01-01 06:00:00 657.099560 col3 1979-01-01 12:00:00 126.254342 col1 1979-01-01 18:00:00 109.545607 col1 

Espero que mi pregunta sea lo suficientemente clara. ¿Alguien tiene una idea de cómo obtener df_result?

Gracias

Greg

Aquí hay una manera, quizás poco elegante, de hacerlo:

 df_result = pd.DataFrame(ts, columns=['value']) 

Configure una función que tome el nombre de la columna que contiene el valor (de ts ):

 def get_col_name(row): b = (df.ix[row.name] == row['value']) return b.index[b.argmax()] 

para cada fila, pruebe qué elementos son iguales al valor y extraiga el nombre de columna de un verdadero.

Y apply (por filas):

 In [3]: df_result.apply(get_col_name, axis=1) Out[3]: 1979-01-01 00:00:00 col5 1979-01-01 06:00:00 col3 1979-01-01 12:00:00 col1 1979-01-01 18:00:00 col1 

es decir, use df_result['Column'] = df_result.apply(get_col_name, axis=1) .

.

Nota: hay mucho que hacer en get_col_name por lo que tal vez justifique una explicación más detallada:

 In [4]: row = df_result.irow(0) # an example row to pass to get_col_name In [5]: row Out[5]: value 1181.220328 Name: 1979-01-01 00:00:00 In [6]: row.name # use to get rows of df Out[6]:  In [7]: df.ix[row.name] Out[7]: col5 1181.220328 col4 912.154923 col3 648.848635 col2 390.986156 col1 138.185861 Name: 1979-01-01 00:00:00 In [8]: b = (df.ix[row.name] == row['value']) #checks whether each elements equal row['value'] = 1181.220328 In [9]: b Out[9]: col5 True col4 False col3 False col2 False col1 False Name: 1979-01-01 00:00:00 In [10]: b.argmax() # index of a True value Out[10]: 0 In [11]: b.index[b.argmax()] # the index value (column name) Out[11]: 'col5' 

Podría ser que hay una manera más eficiente de hacer esto …

Siguiendo con la respuesta detallada de Andy, la solución para seleccionar el nombre de columna del valor más alto por fila se puede simplificar en una sola línea:

 df['column'] = df.apply(lambda x: df.columns[x.argmax()], axis = 1)