代码之家  ›  专栏  ›  技术社区  ›  maurobio

Pandas按列计算值的频率

  •  0
  • maurobio  · 技术社区  · 7 年前

    我正在尝试使用Python/Pandas将一些通常在R中很容易执行的操作应用到下面的示例数据集。

    S1 S2 S3 S4 S5 S6 S7 S8 S9 S10
    QUER.MAC 9 8 3 5 6 0 5 0 0 0
    QUER.VEL 8 9 8 7 0 0 0 0 0 0
    CARY.OVA 6 6 2 7 0 2 0 0 0 0
    PRUN.SER 3 5 6 6 6 4 5 0 4 1
    QUER.ALB 5 4 9 9 7 7 4 6 0 2
    JUGL.NIG 2 0 0 0 3 5 6 4 3 0
    QUER.RUB 3 4 0 6 9 8 7 6 4 3
    JUGL.CIN 0 0 5 0 2 0 0 2 0 2
    ULMU.AME 2 2 4 5 6 0 5 0 2 5
    TILI.AME 0 0 0 0 2 7 6 6 7 6
    ULMU.RUB 4 0 2 2 5 7 8 8 8 7
    CARY.COR 0 0 0 0 0 5 6 4 0 3
    OSTR.VIR 0 0 0 0 0 0 7 4 6 5
    ACER.SAC 0 0 0 0 0 5 4 8 8 9
    

    从文本文件中读取数据后

    import numpy as np
    import pandas as pd
    df = pd.read_csv("sample.txt", header=0, index_col=0, delimiter=' ')
    

    我想:(1)得到大于0的值的频率 每个 (2)求各列中的值之和;(3)求各列中的最大值。

    我设法用

    N = df.apply(lambda x: np.sum(x))
    

    但不知道如何实现(1)和(3)。

    我需要不依赖于列名称的通用解决方案,因为我想将这些操作应用于任何数量的类似矩阵(当然,这些矩阵将具有不同的标签和列/行的数量)。

    提前感谢您的提示和建议。

    2 回复  |  直到 7 年前
        1
  •  3
  •   BENY    7 年前

    你的第一个

    df.gt(0).sum()
    

    第二

    df.sum()
    

    第三

    df.max()
    
        2
  •  0
  •   Scott Boston    7 年前

    你可以用 mask describe 按列获取一系列统计数据。

    df.mask(df <= 0).describe().T
    

    输出:

         count      mean       std  min   25%  50%   75%  max
    S1     9.0  4.666667  2.549510  2.0  3.00  4.0  6.00  9.0
    S2     7.0  5.428571  2.439750  2.0  4.00  5.0  7.00  9.0
    S3     8.0  4.875000  2.642374  2.0  2.75  4.5  6.50  9.0
    S4     8.0  5.875000  2.031010  2.0  5.00  6.0  7.00  9.0
    S5     9.0  5.111111  2.368778  2.0  3.00  6.0  6.00  9.0
    S6     9.0  5.555556  1.878238  2.0  5.00  5.0  7.00  8.0
    S7    11.0  5.727273  1.272078  4.0  5.00  6.0  6.50  8.0
    S8     9.0  5.333333  2.000000  2.0  4.00  6.0  6.00  8.0
    S9     8.0  5.250000  2.314550  2.0  3.75  5.0  7.25  8.0
    S10   10.0  4.300000  2.540779  1.0  2.25  4.0  5.75  9.0
    

    使用面具的原因是 count 计算所有非NaN值,因此屏蔽任何<或=为0的值都将使NaN为 计数 .

    最后,我们还可以添加“sum”,使用 assign :

    df.mask(df<=0).describe().T.assign(sum=df.sum())
    

    输出:

         count      mean       std  min   25%  50%   75%  max  sum
    S1     9.0  4.666667  2.549510  2.0  3.00  4.0  6.00  9.0   42
    S2     7.0  5.428571  2.439750  2.0  4.00  5.0  7.00  9.0   38
    S3     8.0  4.875000  2.642374  2.0  2.75  4.5  6.50  9.0   39
    S4     8.0  5.875000  2.031010  2.0  5.00  6.0  7.00  9.0   47
    S5     9.0  5.111111  2.368778  2.0  3.00  6.0  6.00  9.0   46
    S6     9.0  5.555556  1.878238  2.0  5.00  5.0  7.00  8.0   50
    S7    11.0  5.727273  1.272078  4.0  5.00  6.0  6.50  8.0   63
    S8     9.0  5.333333  2.000000  2.0  4.00  6.0  6.00  8.0   48
    S9     8.0  5.250000  2.314550  2.0  3.75  5.0  7.25  8.0   42
    S10   10.0  4.300000  2.540779  1.0  2.25  4.0  5.75  9.0   43