Skip to main content
 首页 » 编程设计

python之仅对非零值运行 df.describe()

2025年05月04日14wuhuacong

我有一个数据框 daily 看起来像这样

import pandas as pd 
daily 
 
time_stamp  22          72      79          86      87          88          90   
2013-10-01  0.000000    0.000   8.128000    0.254   0.000000    0.000000    0.000000 
2013-10-01  0.000000    0.000   8.128000    0.254   0.000000    0.000000    0.000000 
2013-10-02  0.000000    0.000   0.000000    0.000   0.000000    0.000000    0.000000 
2013-10-04  0.000000    0.000   0.000000    0.000   2.540000    0.762000    0.000000 
2013-10-08  2.286000    0.000   0.000000    1.016   1.016000    0.254000    0.000000 
2013-10-11  2.794000    0.000   0.000000    0.000   3.810000    1.016000    0.762000 
2013-10-12  1.524000    0.000   0.000000    2.286   5.588000    0.254000    26.41600 
2013-10-13  0.762000    0.000   8.890000    0.000   2.540000    1.270000    4.572000 
2013-10-14  1.524000    0.000   0.000000    0.000   2.540000    4.064000    0.000000 
2013-10-15  0.000000    0.000   0.000000    0.000   0.000000    0.000000    0.000000 
2013-10-16  0.000000    3.810   1.524000    3.048   0.508000    0.762000    5.080000 
2013-10-17  0.000000    0.000   0.254000    0.000   0.000000    0.000000    0.508000 
2013-10-18  8.128000    0.762   4.826000    0.508   7.366000    4.572000    1.524000 
2013-10-19  8.382000    0.254   0.000000    0.000   6.858000    16.510000   2.032000 
2013-10-20  0.000000    0.000   0.000000    0.000   4.064000    5.842000    0.000000 
2013-10-21  0.000000    0.508   0.000000    0.000   1.016000    0.000000    0.000000 
2013-10-22  2.794000    2.540   1.016000    0.000   0.508000    15.748000   0.000000 

我想对大于 0 的值进行汇总统计,以便 describe()。

问题是,如果我使用命令 dailyrf = daily[(daily > 0.).any(1)] 当我执行 dailyrf.describe 时,带零的行仍然包含在内()。或者,当我执行 dailyrf = daily[(daily > 0.).all(1)] 时,它只返回所有行中具有 >0 值的行。

我还尝试了 daily[daily==0] = 'NaN' 这给了我一条警告消息:“试图在 DataFrame 的切片副本上设置一个值。 尝试使用 .loc[row_indexer,col_indexer] = value 代替

请参阅文档中的注意事项:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy 这与 ipykernel 包是分开的,所以我们可以避免导入直到。

这也不是一个解决方案,因为 describe 函数返回这个:

        22  72  79  86  87  88  90  93  95  96  97 
count   720 684 721 719 718 720 720 721 720 720 719 
unique  103 80  73  64  80  108 112 108 86  113 98 
top     NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 
freq    470 494 560 510 539 483 486 441 570 474 476 

我真正想要的是每列中所有大于 0 的值的均值、标准差等。

请您参考如下方法:

使用 mask 应该很简单。

df.mask(df == 0).describe() 
 
             22        72        79        86         87         88        90 
count  8.000000  5.000000  7.000000  6.000000  12.000000  11.000000   7.00000 
mean   3.524250  1.574800  4.680857  1.227667   3.196167   4.641273   5.84200 
std    3.000573  1.538745  3.752722  1.174092   2.391229   5.992560   9.24574 
min    0.762000  0.254000  0.254000  0.254000   0.508000   0.254000   0.50800 
25%    1.524000  0.508000  1.270000  0.317500   1.016000   0.762000   1.14300 
50%    2.540000  0.762000  4.826000  0.762000   2.540000   1.270000   2.03200 
75%    4.127500  2.540000  8.128000  1.968500   4.445000   5.207000   4.82600 
max    8.382000  3.810000  8.890000  3.048000   7.366000  16.510000  26.41600 

所有满足 df == 0 的值都会被屏蔽,describe 在计算统计数据时不会考虑这些。