首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效过滤柱

高效过滤柱
EN

Stack Overflow用户
提问于 2018-09-24 18:21:50
回答 2查看 56关注 0票数 1

我有以下数据:

代码语言:javascript
复制
item         = ['item1','item2','item3']
amount       = [500,200,800]
feature_2020 = [18,32,34]
feature_2030 = [28,42,44]
feature_2040 = [38,52,54]
df = pd.DataFrame({'index':item,'amount':amount,'feature_2020': feature_2020,'feature_2030':feature_2030,'feature_2040':feature_2040})
df.index= df['index']
print(df)



         amount   feature_2020  feature_2030  feature_2040  index
index                                                         
item1     500            18            28            38     item1
item2     200            32            42            52     item2
item3     800            34            44            54     item3

我想有效地完成以下工作(我已经可以这样做了,但以非常糟糕的方式):

  • 对于每个特性列(feature_2020、feature_2030、feature_2040),我希望严格过滤20以下的值,20包含严格低于40的值,40包含以上的值。
  • 一旦应用了此筛选器,我希望为上面筛选的每个类别计算剩余项的总量列之和。

预期结果:

代码语言:javascript
复制
inf20            = [500,1000,0]
supequal20_inf40 = [0,500,1000]
supequal40       = [0,500,1000]
index            = ['inf20','supequal20_inf40','supequal40']
result = pd.DataFrame({'sum_feature_2020':inf20,'sum_feature_2030':supequal20_inf40,'sum_feature_2040': supequal40,'index':index})
result.index= result['index']
print(result)



              sum_feature_2020  sum_feature_2030    sum_feature_2040                                                     
inf20               500                0                  0
supequal20_inf40    1000               500                500
supequal40           0                 1000               1000

是否有一种有效的方法来进行这种过滤和操作?

非常感谢你的帮助,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-24 18:36:27

首先,我会融化它,将我们想要存储的所有值放在一列中,然后使用pd.cut保存它,然后再回转。

代码语言:javascript
复制
d2 = df.melt(["index", "amount"])
d2["binned"] = pd.cut(d2.value, [0, 20, 40, np.inf], right=False)
out = d2.pivot_table(index="binned", columns="variable",
                     values="amount", aggfunc=sum).fillna(0)

这给了我

代码语言:javascript
复制
In [172]: out
Out[172]: 
variable      feature_2020  feature_2030  feature_2040
binned                                                
[0.0, 20.0)          500.0           0.0           0.0
[20.0, 40.0)        1000.0         500.0         500.0
[40.0, inf)            0.0        1000.0        1000.0

通过.

代码语言:javascript
复制
In [173]: d2
Out[173]: 
   index  amount      variable  value        binned
0  item1     500  feature_2020     18   [0.0, 20.0)
1  item2     200  feature_2020     32  [20.0, 40.0)
2  item3     800  feature_2020     34  [20.0, 40.0)
3  item1     500  feature_2030     28  [20.0, 40.0)
4  item2     200  feature_2030     42   [40.0, inf)
5  item3     800  feature_2030     44   [40.0, inf)
6  item1     500  feature_2040     38  [20.0, 40.0)
7  item2     200  feature_2040     52   [40.0, inf)
8  item3     800  feature_2040     54   [40.0, inf)
票数 3
EN

Stack Overflow用户

发布于 2018-09-24 18:44:53

另一种方式,不那么普遍的方式

代码语言:javascript
复制
x = df.set_index('amount')[[ 'feature_2020', 'feature_2030', 'feature_2040']]

r1 = x.lt(20).mul(x.index, axis=0).sum()
r2 = (x.ge(20) & x.lt(40)).mul(x.index, axis=0).sum()
r3 = x.ge(40).mul(x.index, axis=0).sum()

df_f = pd.concat([r1,r2,r3], 1).T

    feature_2020    feature_2030    feature_2040
0   500             0               0
1   1000            500             500
2   0               1000            1000
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52485217

复制
相关文章

相似问题

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