2015-04-07 31 views
0

是否有一種有效的方式來查找其絕對值大於熊貓數據框中行中位數的值之和?數值之和大於熊貓數據框中每行的中位數

例如:

 Monday Tuesday Wednesday Thursday Friday Saturday 
0  2.2  4.4  0.5   9   4   3 
1  2   4   1   8   4   5 
2  1.8  4.5  0.9   8   1   15 
3  4   1   5   10  4   5 
… 

如何生成的數字中的每一行,它們比相應的行的中值較大的總和? 25百分位數或75百分位數呢?

回答

2

,並提高@ EdChum的回答得到位數:

quantile = 0.75 # 0.25, 0.5, 0.75, etc. 
df[df.gt(df.quantile(q=quantile, axis=1), axis=0)].sum(axis=1) 

由於只有7天,一一週,我不確定這是否會像預期的那樣工作,除非你有更多的列顯示。你想按列而不是行分位數?

3

我想你想要這樣的:

In [19]: 

df[df.gt(df.median(axis=1), axis=0)] 
Out[19]: 
    Monday Tuesday Wednesday Thursday Friday Saturday 
0  NaN  4.4  NaN   9  4  NaN 
1  NaN  NaN  NaN   8  NaN   5 
2  NaN  4.5  NaN   8  NaN  15 
3  NaN  NaN   5  10  NaN   5 

這使用.gt是大於和用途的價值median(逐行通過傳遞軸= 1)。

然後,您可以撥打這個sum

In [20]: 

df[df.gt(df.median(axis=1), axis=0)].sum() 
Out[20]: 
Monday  NaN 
Tuesday  8.9 
Wednesday  5.0 
Thursday  35.0 
Friday  4.0 
Saturday  25.0 
dtype: float64 
+0

爲了得到這些行的總和,只需將.sum(axis = 1)添加到Ed上面的答案中。 – Alexander

+0

謝謝埃德和亞歷克斯,之前從未使用'.gt'。出於好奇,是否可以使用「應用」來實現相同的功能? – user6396

+0

是的,你可以,但我建議不要這樣做,因爲適用速度很慢,而這將被矢量化,應用應該是最後的手段總是 – EdChum

2

既然你想要的是大於平均每行中總結的值,如果你想保留的日期值,下面的辦法正常工作

def func(row): 
    return row[row>np.percentile(row, 50)].sum() 

func功能現在將應用在DF

In [67]: df['rule'] = df.apply(func, axis=1) 

In [68]: df 
Out[68]: 
    Monday Tuesday Wednesday Thursday Friday Saturday rule 
0  2.2  4.4  0.5   9  4   3 17.4 
1  2.0  4.0  1.0   8  4   5 13.0 
2  1.8  4.5  0.9   8  1  15 27.5 
3  4.0  1.0  5.0  10  4   5 20.0 

而且,對於不同的分位數,你可以使用[25,50,75]在np.percentile(row, x)

+0

謝謝約翰,我很好奇如何使用apply來實現它。 – user6396