说我有一个数据框,该数据框给出了两个碗Fruit
和A
中B
的数量,如下所示:
df = pd.DataFrame({'Fruit':['apple','apple','pear','pear','banana','banana'],
'Bowl': ['A','B','A','B','A','B'],
'Value':[15, 20, 332, 240, 344, 211]}); df
Fruit Bowl Value
apple A 15
apple B 20
pear A 332
pear B 240
banana A 311
banana B 211
我在碗“ A”和“ B”中有水果总数。
num = pd.DataFrame({'Bowl': ['A','B'], 'Num': [330, 200]}); num
Num Type
330 A
200 B
使用Prop
获取每种碗中每种类型的水果的百分比(比例* 100,num
)的一种优雅方法是什么?
Fruit Bowl Value Prop
apple A 15 4.55
apple B 20 ...
pear A 332
pear B 240
banana A 45
banana B 27
因此,Prop
中的计算例如是(碗A中的苹果数量(15)除以碗A中的水果总数(330)* 100 = 4.55。)
**请注意,水果总数不是“ A”碗中苹果+梨+香蕉的总和。您必须使用num
中给出的数字,因为碗中实际上有更多种类的水果。
答案 0 :(得分:1)
您可以通过以下方式实现此目的:首先将num
列“合并”到主df中,然后计算如下比例:
# first merge
df_final = pd.merge(df, num, on='Bowl')
# calculate the proportion
df_final['Prop'] = round(df_final.Value / df_final.Num * 100, 2)
# drop the column Num which was not asked in the output
df_final.drop('Num', axis=1, inplace=True)
Fruit Bowl Value Prop
0 apple A 15 3.53
1 pear A 332 78.12
2 banana A 344 80.94
3 apple B 20 6.35
4 pear B 240 76.19
5 banana B 211 66.98
答案 1 :(得分:1)
使用
df.set_index('Bowl').Value.div(num.set_index('Bowl').Num)*100
Out[72]:
Bowl
A 4.545455
A 100.606061
A 104.242424
B 10.000000
B 120.000000
B 105.500000
dtype: float64
#df['Prop']=df.set_index('Bowl').Value.div(num.set_index('Bowl').Num)*100.values