值大于pandas数据帧中每行中值的值

时间:2015-04-07 18:16:45

标签: python pandas statistics dataframe

有没有一种有效的方法可以找到绝对值大于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百分位数呢?

3 个答案:

答案 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

这使用大于.gtmedian并将其用作{{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)

鉴于一周只有七天,我不确定这是否会按预期进行,除非你有更多的列而不是显示。你想要按列而不是行分位数吗?