2016-07-11 5 views
1

내가 가지고있는 데이터 세트 :팬더 이전 그룹 최소/최대 팬더에서

     Value 
2005-08-03 23:15:00 10.5 
2005-08-03 23:30:00 10.0 
2005-08-03 23:45:00 10.0 
2005-08-04 00:00:00 10.5 
2005-08-04 00:15:00 10.5 
2005-08-04 00:30:00 11.0 
2005-08-04 00:45:00 10.5 
2005-08-04 01:00:00 11.0 
... 
2005-08-04 23:15:00 14.0 
2005-08-04 23:30:00 13.5 
2005-08-04 23:45:00 13.0 
2005-08-05 00:00:00 13.5 
2005-08-05 00:15:00 14.0 
2005-08-05 00:30:00 14.0 
2005-08-05 00:45:00 14.5 

먼저 내가 날짜를 기준으로 그룹 데이터를 원했고, 새로운 열에서 각 그룹의 최대 값을 저장, 나는이 작업을 위해 다음 코드를 사용 :

df['ValueMaxInGroup'] = df.groupby(pd.TimeGrouper('D'))['Value'].transform(max) 

는 지금은 이전 그룹의 최대 값을 저장하기 위해 다른 열을 만들려면, 그래서 원하는 데이터 프레임이 보일 것 같은 :

     Value ValueMaxInGroup ValueMaxInPrevGroup 
2005-08-03 23:15:00 10.5    10.5     NaN 
2005-08-03 23:30:00 10.0    10.5     NaN 
2005-08-03 23:45:00 10.0    10.5     NaN 
2005-08-04 00:00:00 10.5    14.0     10.5 
2005-08-04 00:15:00 10.5    14.0     10.5 
2005-08-04 00:30:00 11.0    14.0     10.5 
2005-08-04 00:45:00 10.5    14.0     10.5 
2005-08-04 01:00:00 11.0    14.0     10.5 
... 
2005-08-04 23:15:00 14.0    14.0     10.5 
2005-08-04 23:30:00 13.5    14.0     10.5 
2005-08-04 23:45:00 13.0    14.0     10.5 
2005-08-05 00:00:00 13.5    14.5     14.0 
2005-08-05 00:15:00 14.0    14.5     14.0 
2005-08-05 00:30:00 14.0    14.5     14.0 
2005-08-05 00:45:00 14.5    14.5     14.0 

그래서, 단순히 이전 행의 값을 얻기 위해, 나는

df['ValueInPrevRow'] = df.shift(1)['Value'] 

다른 그룹의 최소/최대/F (X)를 얻을 수있는 방법이 있나요

를 사용? 나는 생각했다.

df['ValueMaxInPrevGroup'] = df.groupby(pd.TimeGrouper('D')).shift(1)['Value'].transform(max) 

그러나 작동하지 않았다.

감사

답변

1

당신은 groupby/agg, shiftmerge 사용하여 원하는 결과를 얻을 수 있습니다 :

     Value  group Max PreviouMax 
2005-08-03 23:15:00 10.5 2005-08-03 10.5   NaN 
2005-08-03 23:30:00 10.0 2005-08-03 10.5   NaN 
2005-08-03 23:45:00 10.0 2005-08-03 10.5   NaN 
2005-08-04 00:00:00 10.5 2005-08-04 14.0  10.5 
2005-08-04 00:15:00 10.5 2005-08-04 14.0  10.5 
2005-08-04 00:30:00 11.0 2005-08-04 14.0  10.5 
2005-08-04 00:45:00 10.5 2005-08-04 14.0  10.5 
2005-08-04 01:00:00 11.0 2005-08-04 14.0  10.5 
2005-08-04 23:15:00 14.0 2005-08-04 14.0  10.5 
2005-08-04 23:30:00 13.5 2005-08-04 14.0  10.5 
2005-08-04 23:45:00 13.0 2005-08-04 14.0  10.5 
2005-08-05 00:00:00 13.5 2005-08-05 14.5  14.0 
2005-08-05 00:15:00 14.0 2005-08-05 14.5  14.0 
2005-08-05 00:30:00 14.0 2005-08-05 14.5  14.0 
2005-08-05 00:45:00 14.5 2005-08-05 14.5  14.0 

여기에 주요 아이디어는 대신 groupby/agg을 사용하는 것입니다

import numpy as np 
import pandas as pd 
df = pd.DataFrame({'Value': [10.5, 10.0, 10.0, 10.5, 10.5, 11.0, 10.5, 11.0, 14.0, 13.5, 13.0, 13.5, 14.0, 14.0, 14.5]}, index=['2005-08-03 23:15:00', '2005-08-03 23:30:00', '2005-08-03 23:45:00', '2005-08-04 00:00:00', '2005-08-04 00:15:00', '2005-08-04 00:30:00', '2005-08-04 00:45:00', '2005-08-04 01:00:00', '2005-08-04 23:15:00', '2005-08-04 23:30:00', '2005-08-04 23:45:00', '2005-08-05 00:00:00', '2005-08-05 00:15:00', '2005-08-05 00:30:00', '2005-08-05 00:45:00']) 
df.index = pd.DatetimeIndex(df.index) 

# This is equivalent to 
# df['group'] = pd.to_datetime(df.index.date) 
# when freq='D', but the version below works with any freq string, not just `'D'`. 
grouped = df.groupby(pd.TimeGrouper('D')) 
labels, uniqs, ngroups = grouped.grouper.group_info 
df['group'] = grouped.grouper.binlabels[labels] 

result = grouped[['Value']].agg(max) 
result = result.rename(columns={'Value':'Max'}) 
result['PreviouMax'] = result['Max'].shift(1) 

df = pd.merge(df, result, left_on=['group'], right_index=True) 
print(df) 

를 산출,259,우리

result = grouped[['Value']].agg(max) 
result = result.rename(columns={'Value':'Max'}) 
result['PreviouMax'] = result['Max'].shift(1) 
#    Max PreviouMax 
# group      
# 2005-08-03 10.5   NaN 
# 2005-08-04 14.0  10.5 
# 2005-08-05 14.5  14.0 

는 다음 원하는 DataFrame가 group 날짜 result으로 df 병합의 결과로서 표현 될 수 얻을 수 있도록.