2017-10-17 46 views
1

給出一個數據幀的熊貓與類別列family和數值列score組的數量,我想family誰高於(或低於)必須得到這些的數量爲家庭中位數score大熊貓得到上述中值水平

概念上的東西呢? df.groupby('family')['score'].median().filter(lambda x: x>x.median)

任何幫助?

+0

您可以張貼小樣本數據集和期望? – MaxU

+0

你會不會假設所有分數都不同?在這種情況下,所有你需要的是'df.groupby('family')。count()// 2'。 – fuglede

回答

2

這聽起來像你正在尋找類似

df[df.score > df.groupby('family').score.transform('median')].groupby('family').count() 
2

這是你想要的嗎?通過這樣做,您可以同時在上方和下方進行操作。

df.groupby('family')['Score'].apply(lambda x : pd.Series(x>np.median(x)).value_counts()) 

樣本數據:

df = pd.DataFrame({'family': ['a','b','c']*3, 'B': ['d','e','f']*3, 'Score': [1,2,3,3,2,3,2,3,1]}) 

輸出地說:

Out[31]: 
family  
a  False 2 
     True  1 
b  False 2 
     True  1 
c  False 3 
Name: Score, dtype: int64 

獎勵:

df.groupby('family')['Score'].apply(lambda x : pd.Series(x>np.median(x)).value_counts()).\ 
     unstack().rename(columns={True:'Above_med',False:'Below_med'}) 


Out[34]: 
     Below_med Above_med 
family      
a    2.0  1.0 
b    2.0  1.0 
c    3.0  NaN 
1

你可以嘗試這樣的事:

df = pd.DataFrame({'family':['Family '+str(i) for i in np.random.choice(list('ABCD'),100)],'score':np.random.randint(40,100,100)}) 

above_avg = lambda x: (x>x.mean()).sum() 
above_avg.__name__ = 'Above Average' 
below_avg = lambda x: (x<=x.mean()).sum() 
below_avg.__name__ = 'Below Average' 
df.groupby('family')['score'].agg([above_avg, below_avg]) 

輸出:

  Above Average Below Average 
family         
Family A    9    12 
Family B    11    15 
Family C    12    12 
Family D    15    14 
1

我會使用一個數據集lambda,充分利用numpy

f = lambda x: (lambda v: np.count_nonzero(v > np.median(v)))(x.values) 
df.groupby('family').Score.apply(f)