2013-02-06 15 views
8

Sto cercando di trovare, ad ogni timestamp, il nome della colonna in un dataframe per il quale il valore corrisponde a quello in un magazzino con lo stesso timestamp.Ottieni il nome della colonna in cui il valore è qualcosa in pandas dataframe

Ecco il mio 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': {<Timestamp: 1979-01-01 06:00:00>: 920.76797370744271, <Timestamp: 1979-01-01 00:00:00>: 912.15492332839756, <Timestamp: 1979-01-01 18:00:00>: 897.58592995700656, <Timestamp: 1979-01-01 12:00:00>: 918.1214819496729}, 'col5': {<Timestamp: 1979-01-01 06:00:00>: 1190.7244605667831, <Timestamp: 1979-01-01 00:00:00>: 1181.2203275146587, <Timestamp: 1979-01-01 18:00:00>: 1171.6702763228691, <Timestamp: 1979-01-01 12:00:00>: 1193.4145103184442}, 'col2': {<Timestamp: 1979-01-01 06:00:00>: 399.39533771666561, <Timestamp: 1979-01-01 00:00:00>: 390.98615646597591, <Timestamp: 1979-01-01 18:00:00>: 366.65203285812231, <Timestamp: 1979-01-01 12:00:00>: 384.63247469269874}, 'col3': {<Timestamp: 1979-01-01 06:00:00>: 657.09956023625466, <Timestamp: 1979-01-01 00:00:00>: 648.84863460462293, <Timestamp: 1979-01-01 18:00:00>: 629.20146872682449, <Timestamp: 1979-01-01 12:00:00>: 648.55883747413225}, 'col1': {<Timestamp: 1979-01-01 06:00:00>: 147.7613518219286, <Timestamp: 1979-01-01 00:00:00>: 138.18586102094068, <Timestamp: 1979-01-01 18:00:00>: 109.54560722575859, <Timestamp: 1979-01-01 12:00:00>: 126.25434189361377}} 

E le serie storiche con i valori che voglio abbinare ad ogni timestamp:

>>> 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() 
{<Timestamp: 1979-01-01 06:00:00>: 657.09956023625466, <Timestamp: 1979-01-01 00:00:00>: 1181.2203275146587, <Timestamp: 1979-01-01 18:00:00>: 109.54560722575859, <Timestamp: 1979-01-01 12:00:00>: 126.25434189361377} 

allora il risultato sarebbe:

>>> 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 

Spero che la mia domanda sia abbastanza chiara. Qualcuno ha un'idea su come ottenere df_result?

Grazie

Greg

risposta

4

Qui è uno, forse poco elegante, modo per farlo:

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

impostare una funzione, che prende il nome della colonna che contiene il valore (da ts) :

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

per ogni riga, verifica quali elementi sono uguali al valore e estrai il nome della colonna di un Vero.

E apply esso (row-wise):

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 

cioè utilizzare df_result['Column'] = df_result.apply(get_col_name, axis=1).

.

Nota: c'è un bel sacco di cose in get_col_name quindi forse merita qualche ulteriore spiegazione:

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]: <Timestamp: 1979-01-01 00:00:00> 

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' 

Potrebbe essere non c'è modo più efficace per fare questo ...

+0

Grazie @Andy, ha funzionato. – leroygr

3

In seguito alla risposta dettagliata di Andy, la soluzione per selezionare il nome della colonna del valore più alto per riga può essere semplificata su una singola riga:

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