按列计算值的频率

2024-05-19 19:28:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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)求每列的值大于零的频率;(2)求每列的值之和;(3)求每列的最大值。你知道吗

我设法获得(2)使用

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

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

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

提前感谢您的任何提示和建议。你知道吗


Tags: 数据import示例pandasdfasnp矩阵
2条回答

可以使用maskdescribe按列获取一组统计信息。你知道吗

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

使用mask的原因是count统计所有非NaN值,因此将<;or=屏蔽为0将使count的值为NaN。你知道吗

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

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

你的第一个

df.gt(0).sum()

第二

df.sum()

第三

df.max()

相关问题 更多 >