【问题标题】:sum of values larger than median of each row in pandas dataframes大于熊猫数据框中每行中位数的值的总和
【发布时间】:2015-04-07 18:16:44
【问题描述】:

有没有一种有效的方法来查找绝对值大于熊猫数据框中行的中位数的值的总和?

例如:

      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% 呢?

【问题讨论】:

    标签: python pandas statistics dataframe


    【解决方案1】:

    我想你想要这个:

    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
    

    这使用大于 median.gt 并将其用作值(通过传递轴 = 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
    

    【讨论】:

    • 要获得这些行的这些值的总和,只需将 .sum(axis=1) 添加到 Ed 的上述答案中。
    • 感谢 Ed 和 Alex,以前从未使用过 '.gt'。只是出于好奇,是否可以使用'apply'来实现相同的功能?
    • 是的,你可以,但我建议不要这样做,因为 apply 很慢,而这将被矢量化,apply 应该是最后的手段
    【解决方案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】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-18
        • 2017-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-18
        • 1970-01-01
        相关资源
        最近更新 更多