2013-02-06 2 views
8

각 timestamp에서 값이 timestamp에있는 timeseries의 값과 일치하는 데이터 프레임에서 열 이름을 찾으려고합니다.팬더 데이터 프레임에 값이있는 열 이름을 가져옵니다.

>>> 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()] 

어떤 요소가 값과 동일한 지 테스트하고 True의 열 이름을 추출하십시오.

그리고 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

Andy의 자세한 대답을 살펴보면 행당 가장 높은 값의 열 이름을 선택하는 방법을 한 줄로 단순화 할 수 있습니다.

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