从熊猫数据帧中的行子集计算平均值:groupby或for循环?

时间:2019-02-17 23:31:28

标签: python pandas dataframe

说我有一个数据框,该数据框给出了两个碗FruitAB的数量,如下所示:

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中给出的数字,因为碗中实际上有更多种类的水果。

2 个答案:

答案 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