代码之家  ›  专栏  ›  技术社区  ›  JAG2024

从pandas数据框中的行子集计算平均值:groupby还是for loop?

  •  0
  • JAG2024  · 技术社区  · 7 年前

    假设我有一个数据框,它给出了 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
    

    获得百分比(比例*100, Prop )每个碗中每种类型的水果,使用 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    
    

    因此,计算 道具 例如(碗A中的苹果数(15)除以碗A中的水果总数(330)*100=4.55。)

    **请注意,水果的总数不是碗“A”中苹果+梨+香蕉的总和。你必须使用中给出的数字 号码 因为碗里其实有更多种类的水果。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Erfan    7 年前

    实现这一点的一种方法是首先“合并” 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
    
        2
  •  1
  •   BENY    7 年前

    使用

    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