2013-02-06 21 views
8

में मूल्य कुछ है, मैं प्रत्येक टाइमस्टैम्प पर, डेटाफ्रेम में कॉलम नाम ढूंढने की कोशिश कर रहा हूं जिसके लिए मूल्य एक ही टाइमस्टैम्प पर एक टाइमरीज़ में किसी के साथ मेल खाता है।कॉलम नाम प्राप्त करें जहां पैंडस डेटाफ्रेम

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

और मूल्यों मैं एक टाइमस्टैम्प पर मेल करना चाहते हैं के साथ समय श्रृंखला:

यहाँ मेरी dataframe है

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

फिर परिणाम होगा:

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

मुझे उम्मीद है कि मेरा प्रश्न पर्याप्त स्पष्ट है। किसी को भी पता है कि df_result कैसे प्राप्त करें?

धन्यवाद

ग्रेग

उत्तर

4

यहाँ एक, शायद असजीला है, जिस तरह से यह करने के लिए:

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

एक समारोह जो (ts से) स्तंभ नाम जो मान पकड़ लेता सेट करें :

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

प्रत्येक के लिए पंक्ति, परीक्षण करें कि कौन से तत्व मान के बराबर हैं, और सत्य के कॉलम नाम निकालें।

और apply यह (पंक्ति-वार):

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 

अर्थात df_result['Column'] = df_result.apply(get_col_name, axis=1) का उपयोग करें।

नोट: काफी एक बहुत get_col_name में चल रही तो शायद यह कुछ अधिक विवरण के समर्थन करती वहाँ है:

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' 

यह हो सकता है वहाँ यह करने के लिए अधिक प्रभावी हो सकता है ...

+0

धन्यवाद @ एंडी, यह काम किया। – leroygr

3

एंडी के विस्तृत उत्तर के बाद, प्रति पंक्ति उच्चतम मूल्य के कॉलम नाम का चयन करने का समाधान एक पंक्ति में सरलीकृत किया जा सकता है:

df['column'] = df.apply(lambda x: df.columns[x.argmax()], axis = 1) 
संबंधित मुद्दे