首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python - Pandas -根据行平均值过滤出列

Python - Pandas -根据行平均值过滤出列
EN

Stack Overflow用户
提问于 2018-07-23 02:58:57
回答 1查看 50关注 0票数 -1

我有一个包含多个列和一个日期索引的DataFrame:

代码语言:javascript
复制
TIME           A         B          C              D              E 
---------------------------------------------------------------------    
2015-03-01   0.74      -0.70       2.62           2.64           3.43   
2015-03-02   0.15      -1.28       0.56           400.58         0.08   
2015-03-03  -0.18      -3.82       0.21           0.22          -0.32   
2015-03-04  -1.45      -1.26       0.74           0.76          -0.09   
2015-03-05 -13.01     -12.88     -16.46         -16.45         -11.67   
2015-03-06 -47.73     -57.09     -55.45         -55.51         -55.15   
2015-03-07  -2.31      -3.57     -36.24         -39.50           2.87   
2015-03-08   0.64       0.34       1.76           1.75           1.51   

并且我希望删除任何至少有一个条目的列,这些条目的值不在行平均值的100以内。

换句话说,如果日期2015-03-02的所有列的平均值是80.018,那么我只想保留这个特定日期的值在-19.982和180.018之间的列。因此,在本例中,我将排除D列,因为它的值不在该范围内。

我也不想遍历dataframe的行,所以我正在寻找一种非常pythonic式的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-23 03:06:49

我认为需要:

代码语言:javascript
复制
#if necessary create DatetimeIndex
df = df.set_index('TIME')

#get mean per rows
s = df.mean(axis=1)
#create boolean mask by +/- 100 chained by OR (|)
m = (df.gt(s + 100, axis=0) ) | (df.lt(s - 100, axis=0))

#remove column by condition - inverted mask with any for check at least one True
df = df.loc[:, ~m.any()]
print (df)
                A      B      C      E
TIME                                  
2015-03-01   0.74  -0.70   2.62   3.43
2015-03-02   0.15  -1.28   0.56   0.08
2015-03-03  -0.18  -3.82   0.21  -0.32
2015-03-04  -1.45  -1.26   0.74  -0.09
2015-03-05 -13.01 -12.88 -16.46 -11.67
2015-03-06 -47.73 -57.09 -55.45 -55.15
2015-03-07  -2.31  -3.57 -36.24   2.87
2015-03-08   0.64   0.34   1.76   1.51

Detail

代码语言:javascript
复制
print (m)
                A      B      C      D      E
TIME                                         
2015-03-01  False  False  False  False  False
2015-03-02  False  False  False   True  False
2015-03-03  False  False  False  False  False
2015-03-04  False  False  False  False  False
2015-03-05  False  False  False  False  False
2015-03-06  False  False  False  False  False
2015-03-07  False  False  False  False  False
2015-03-08  False  False  False  False  False

另一种解决方案:

代码语言:javascript
复制
m = (df.lt(s + 100, axis=0) ) & (df.gt(s - 100, axis=0))

#check all Trues per columns
df = df.loc[:, m.all()]

代码语言:javascript
复制
print (m)
               A     B     C      D     E
TIME                                     
2015-03-01  True  True  True   True  True
2015-03-02  True  True  True  False  True
2015-03-03  True  True  True   True  True
2015-03-04  True  True  True   True  True
2015-03-05  True  True  True   True  True
2015-03-06  True  True  True   True  True
2015-03-07  True  True  True   True  True
2015-03-08  True  True  True   True  True
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51468346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档