다음 데이터를 사용하여 .groupby
with 를 사용하여 여러 계산을 현명하게 수행하려고합니다 pandas
dataframe
.
import numpy as np
import pandas as pd
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C' : np.random.randn(8),
'D' : np.random.randn(8)})
In [2]: df
Out[2]:
A B C D
0 foo one 0.469112 -0.861849
1 bar one -0.282863 -2.104569
2 foo two -1.509059 -0.494929
3 bar three -1.135632 1.071804
4 foo two 1.212112 0.721555
5 bar two -0.173215 -0.706771
6 foo one 0.119209 -1.039575
7 foo three -1.044236 0.271860
다음 출력을 더 짧고 빠른 방법으로 계산하고 싶습니다 .
A B var1 var2 var3
bar one 0.000000 0.000000 0.000000
three 0.000000 0.000000 0.000000
two 0.000000 0.000000 0.000000
foo one 0.822999 19.705290 0.731207
three 0.000000 0.000000 0.000000
two 0.229541 5.509553 0.697971
현재로서는 별도의 방법으로 수행하는 방법을 알고 있습니다.
# lambda functions to apply
diff = lambda x: max(x)-min(x)
per = lambda x: (max(x)-min(x))/max(x)
ratio1 = lambda x: (max(x)-min(x))/ len(x)
# grouping using col C
df.groupby(['A','B'])['C'].apply(diff) # var1
#Grouping using col D
df.groupby(['A','B'])['D'].apply(per) # var2
df.groupby(['A','B'])['D'].apply(ratio1) #var3
편집 : 모든 결과를 데이터 프레임에 결합하는 방법을 알고 있지만이 세 가지 작업을 하나로 수행하는 방법이 궁금합니다. 성능이 낮기 때문에 모든 것을 한꺼번에하지 말라는 조언도 받아 들여집니다.
다음을 사용할 수 있습니다 agg()
.
df.groupby(['A','B']).agg({'C': diff, 'D': [per, ratio1]})
이름 변경 부분 당신이 당신의 함수를 호출 할 수 있습니다 건너 뛰려면 var1
, var2
그리고 var3
과에서 사용을 groupby
.
var1 = lambda x: max(x)-min(x)
var2 = lambda x: (max(x)-min(x))/max(x)
var3 = lambda x: (max(x)-min(x))/ len(x)
df.groupby(['A','B']).agg({'C': var1, 'D': [var2, var3]})
df.columns = df.columns.droplevel()
편집하다
시도해보십시오 :
def var1(x): return max(x)-min(x)
def var2(x): return (max(x)-min(x))/max(x)
def var3(x): return (max(x)-min(x))/ len(x)
EDIT의 편집
이것은 pandas
버전 에서 나를 위해 작동합니다 0.19.2
.
import numpy as np
import pandas as pd
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C' : np.random.randn(8),
'D' : np.random.randn(8)})
def var1(x): return max(x)-min(x)
def var2(x): return (max(x)-min(x))/max(x)
def var3(x): return (max(x)-min(x))/ len(x)
df = df.groupby(['A','B']).agg({'C': var1, 'D': [var2, var3]})
df.columns = df.columns.droplevel()
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다