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

sum of values larger than median of each row in pandas dataframes

在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 个百分点呢?

我想你想要这个:

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 which is greater than and uses as the value the 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

由于您想对每行中大于中位数的值求和,并且如果您想保留 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]

并增强@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 天,我不确定这是否会按预期进行,除非您有比显示更多的列。你想要按列而不是按行的分位数吗?