首页 > 解决方案 > Pandas:如何对基于两列的过滤行进行数学计算?

问题描述

我有以下数据框,我需要对过滤的行进行数学运算。

data = pd.DataFrame({'name': ['jpy','jpy','eur','usd','usd','usd'],'currency':['jpy_23','jpy_23','eur_15', 'thb_20','thb_20','thb_20'], 
    'sal':[15.0,20.0,25.0,30.0,20.0,15.0 ]})

我想基于如下两列进行分组:

df1 = df.groupby(['name','currency'])

然后我想对每个组进行以下操作,如下所示:

len(data[(data['sal']>25)])/len(data.index)
len(data[(data['sal']<=25)])/len(data.index)
len(data[(data['sal']>=0) & (data['sal']<5)])/len(data.index)
len(data[(data['sal']>=5) & (data['sal']<15)])/len(data.index)
len(data[(data['sal']>=15) & (data['sal']<25)])/len(data.index)

最后,预期的数据框应该如下所示。空列应包含计算值。请建议如何获得预期的输出。

new_data = pd.DataFrame({'name': ['jpy','eur','usd'],'currency':['jpy_23','eur_15','thb_20'], 
    '>25':[ ], '<= 25': [ ], 'Between 0 & 5': [ ], 'Between 5 & 15' : [ ], 'Between >15 & 25': [ ]})

标签: pythonpandas

解决方案


或许:

In [4]: bins = [0, 5, 15, 25, float("inf")]
   ...: groups = data.groupby(['name', 'currency', pd.cut(data['sal'], bins)])
   ...: d = groups.size().unstack()
   ...: d.div(d.sum(axis=1), axis=0)
Out[4]:
sal            (0.0, 5.0]    (5.0, 15.0]   (15.0, 25.0]  (25.0, inf] 
name currency                                                        
eur  eur_15             0.0      0.000000      1.000000      0.000000
     jpy_23             NaN           NaN           NaN           NaN
     thb_20             NaN           NaN           NaN           NaN
jpy  eur_15             NaN           NaN           NaN           NaN
     jpy_23             0.0      0.500000      0.500000      0.000000
     thb_20             NaN           NaN           NaN           NaN
usd  eur_15             NaN           NaN           NaN           NaN
     jpy_23             NaN           NaN           NaN           NaN
     thb_20             0.0      0.333333      0.333333      0.333333

推荐阅读