Python 列的高效过滤
我有以下数据帧:Python 列的高效过滤,python,pandas,dataframe,filtering,calculation,Python,Pandas,Dataframe,Filtering,Calculation,我有以下数据帧: 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':f
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
我想有效地做到以下几点(我已经可以做到了,但方式非常糟糕):
- 对于每个要素列(要素2020、要素2030、要素2040),我希望过滤严格小于20、介于20和严格小于40之间以及大于40的值
- 应用此过滤器后,我想计算上面过滤的每个类别的剩余项目的金额列的总和
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
有没有一种方法可以有效地进行过滤和操作
非常感谢您的帮助,首先,我会将其融化,将所有要存储的值放在一列中,然后使用
pd.cut
将其存储,然后我会将其转回来
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)
这让我
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
借
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)
首先,我将它融化,将所有我们想要存储的值放在一列中,然后使用
pd.cut
将其存储,然后我将返回
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)
这让我
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
借
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)
另一种方法,不太普遍的方法
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
另一种方法,不太普遍的方法
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
要素_2030和要素_2040中的值属于相同的类别。为什么结果不同?对不起,在结果部分出错了,我把矩阵倒过来了。我更新了这个帖子,效果很好@Rafaelc要素_2030和要素_2040中的值属于相同的类别。为什么结果不同?对不起,在结果部分出错了,我把矩阵倒过来了。我更新了这个帖子,效果很好@拉斐尔