有没有一种有效的方法可以找到绝对值大于pandas数据框中行的中位数的值之和?
例如:
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百分位数呢?
答案 0 :(得分: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
并将其用作{{3}}的值(通过传递轴= 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
答案 1 :(得分:2)
由于你想要将每行中的值加总,然后大于中位数,如果你想保留Day值,下面的方法可以正常工作
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
并且,对于不同的分位数,您可以在np.percentile(row, x)
中使用[25,50,75]
答案 2 :(得分: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)
鉴于一周只有七天,我不确定这是否会按预期进行,除非你有更多的列而不是显示。你想要按列而不是行分位数吗?