다음과 같은 데이터 프레임이 있습니다.
df = pd.DataFrame({'regionname' : [10022, 10128, 10022, 10022, 10128],
'date' : ['1996-04-01', '2005-01-01', '2014-05-01', '2006-04-01', '2017-06-01', '2017-06-01'],
'median_price': [np.nan, 257700.0, 407100.0, 500000.0, 750000.0, 325000 ]})
-----------------------------------------
Output:
regionname date median_price
0 10022 1996-04-01 NaN
1 10128 2014-05-01 407100.0
2 10022 2006-04-01 500000.0
3 10022 2017-06-01 750000.0
4 10128 2017-06-01 325000.0
모두 regionname
데이터 세트의 우편 번호에 해당합니다. 도움이된다면 1996-04 년부터 2017-06 년까지의 모든 날짜에 내가 긴 형태로 녹인 중간 가격이 포함되어있는 데이터는 원래 와이드 형식이었습니다.
a로 최소 날짜를 찾고 median_price
최대 날짜 (2017-06-01)에서 빼서 변화율을 조사하고 싶습니다. 모든 regionname
(우편 번호)에는 최대 날짜에 대한 데이터가 있지만 최소 날짜는 다릅니다. 나는 여기에서 groupby를 제안했지만 그 게시물을 작동시킬 수 없었던 게시물을 보았습니다. 제 경우에는 grp = df.groupby('regionname')
.
내 목표는 새 열 또는 집계를 통해 변경 사항을 계산하는 것입니다. 나는 이와 같은 것을 시도했지만 dropna()
groupby에서 작동하지 않으면 최대를 뺄 수 있습니다.
min_test = df.groupby(['regionname','date'])['median_price'].dropna().min()
max_test = df.groupby(['regionname','date'])['median_price']
샘플 예상 출력은 다음과 같을 수 있습니다.
regionname change
0 10022 250000.0
1 10128 -82100.0
...
데이터에는 25 개의 고유 한 우편 번호가 있으며 날짜 범위는 1996-04-01부터 2017-06-01까지이므로 최소한 기본 출력 옵션을 포함해야합니다.
내가 사용할 수 있는지 np.nanmin
또는 최선의 접근 방식이 무엇인지 확실하지 않습니다 . 내가 놓친 간단한 접근 방식이 있다고 느낍니다.
첫 번째 아이디어는 DataFrame.sort_values
두 열 모두에서 사용한 다음 첫 번째와 마지막 값을 빼는 것입니다. 기본적으로 누락 된 값이 제거되기 때문에 올바르게 작동합니다.
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(['regionname','date'])
g = df.groupby(['regionname'])['median_price']
df['change'] = g.transform('last') - g.transform('first')
df = df.sort_index()
print (df)
regionname date median_price change
0 10022 1996-04-01 NaN 250000.0
1 10128 2014-05-01 407100.0 -82100.0
2 10022 2006-04-01 500000.0 250000.0
3 10022 2017-06-01 750000.0 250000.0
4 10128 2017-06-01 325000.0 -82100.0
아니면 의해 인덱스 값의 차이를 사용 DataFrameGroupBy.idxmax
하고 DataFrameGroupBy.idxmin
있지만, 불행하게도없는 값에 의해 처음 그래서 필요 생략되지 않고 DataFrame.dropna
다음으로 새 값 열을 생성 Series.map
:
df['date'] = pd.to_datetime(df['date'])
g = (df.dropna(subset=['median_price'])
.set_index('median_price')
.groupby(['regionname'])['date'])
df['change'] = df['regionname'].map(g.idxmax() - g.idxmin())
print (df)
regionname date median_price change
0 10022 1996-04-01 NaN 250000.0
1 10128 2014-05-01 407100.0 -82100.0
2 10022 2006-04-01 500000.0 250000.0
3 10022 2017-06-01 750000.0 250000.0
4 10128 2017-06-01 325000.0 -82100.0
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다