나는 df
다음과 같은 것을 가지고 있습니다 .
Day Country Type Product Cost
Mon US 1 a1 0
Mon US 2 a1 5
Mon US 3 a1 6
Mon CA 1 a1 8
Mon CA 2 a1 0
Mon CA 3 a1 1
나는 이것을 만들려고 노력하고 있습니다.
Day Country Type Product Cost Average
Mon US 1 a1 0 (5+6)/2
Mon US 2 a1 5 (5+6)/2
Mon US 3 a1 6 (5+6)/2
Mon CA 1 a1 8 (8+1)/2
Mon CA 2 a1 0 (8+1)/2
Mon CA 3 a1 1 (8+1)/2
아이디어는 그룹에 의해입니다 Country
및 Product
평균 비용을 갔지만을 Costs
어디에 그 >0
.
내가 시도한 것 :
np.where(df['Cost']>0, df.loc[df.groupby(['Country','Product'])]['Cost'].mean())
그러나 나는 얻는다 :
ValueError : 다차원 키로 인덱싱 할 수 없습니다.
.mean(), max(), etc
필터가있는 그룹화 된 pandas 데이터 프레임과 같은 내장 함수를 적용하는 모범 사례 솔루션은 무엇입니까 ?
첫 번째 생각은 대체입니다 0
에 NaN
사용하는 다음의와 GroupBy.transform
함께 mean
기본적으로 생략 값을 누락 :
print (df.assign(new = df['Cost'].where(df['Cost'] > 0)))
Day Country Type Product Cost new
0 Mon US 1 a1 0 NaN
1 Mon US 2 a1 5 5.0
2 Mon US 3 a1 6 6.0
3 Mon CA 1 a1 8 8.0
4 Mon CA 2 a1 0 NaN
5 Mon CA 3 a1 1 1.0
df['Average'] = (df.assign(new = df['Cost'].where(df['Cost'] > 0))
.groupby(['Country','Product'])['new']
.transform('mean'))
print (df)
Day Country Type Product Cost Average
0 Mon US 1 a1 0 5.5
1 Mon US 2 a1 5 5.5
2 Mon US 3 a1 6 5.5
3 Mon CA 1 a1 8 4.5
4 Mon CA 2 a1 0 4.5
5 Mon CA 3 a1 1 4.5
또는 먼저 다음을 기준으로 필터링, 집계 mean
및 다시 할당 DataFrame.join
:
s = df[df["Cost"] > 0].groupby(['Country','Product'])['Cost'].mean().rename('Average')
df = df.join(s, on=['Country','Product'])
print (df)
Day Country Type Product Cost Average
0 Mon US 1 a1 0 5.5
1 Mon US 2 a1 5 5.5
2 Mon US 3 a1 6 5.5
3 Mon CA 1 a1 8 4.5
4 Mon CA 2 a1 0 4.5
5 Mon CA 3 a1 1 4.5
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다