【问题标题】:Creating function to filter and calculate division of rows based on filter?创建函数来过滤和计算基于过滤器的行划分?
【发布时间】:2019-09-04 23:36:26
【问题描述】:

我有一个如下的df:

我正在使用如下简单代码:过滤 df 中的列,然后根据列的值计算简单的数学, 所以如果列值被取消,处理,完成;我想计算整个 df 或所有行的取消的百分比或行数。

df 看起来像:

   ID |    Status    |   Color
   555    Cancelled     Green
   434    Processed     Red   
   212    Cancelled     Blue
   121    Cancelled     Green
   242    Cancelled     Blue
   352    Processed     Green
   343    Processed     Blue

我目前使用的代码是:

df[df['Color'] == 'Green']

df[(df['Status']=='Cancelled') & (df['Color']=='Green')]

对于每种不同类型的颜色的含义,我首先手动过滤 df 以获得行数,然后在下面对其进行双重过滤以获得取消的行数或订单数,然后手动除以该 # 但他 # 只是绿色行。

如果我想创建一个函数,我可以在其中插入颜色名称和状态,然后在一个简单的函数中进行数学运算,那么最好的方法是什么?

预期输出类似于:

 Status      Green
Cancelled    0.666667
Processed    0.333333
dtype: float64

非常感谢!

【问题讨论】:

    标签: python python-3.x pandas function data-science


    【解决方案1】:

    你可以使用 groupby 和 len():

    df.groupby(by='Status').apply(lambda x: len(x)/len(df))
    
    Status
    Cancelled    0.666667
    Processed    0.333333
    dtype: float64
    

    按状态和颜色分类:

    cc = df.groupby(by='Color').ID.count()
    df.groupby(by=['Color', 'Status']).apply(lambda x: len(x)/cc.loc[x.Color.iloc[0]])
    
    Color  Status   
    Blue   Cancelled    0.666667
           Processed    0.333333
    Green  Cancelled    0.666667
           Processed    0.333333
    Red    Processed    1.000000
    dtype: float64
    

    【讨论】:

    • 谢谢,但我也想按颜色列过滤
    • 你能给出你预期的输出吗?
    • 预期的输出就像你的答案一样添加,除了它是我可以选择的某种颜色而不是整体 df
    • 预期的输出对我来说不太有意义。其他颜色在哪里,绿色没有经过处理,但为什么绿色处理为 0.333?
    • 我给了一个数据样本,意思是df中还有很多其他行我更新了样本数据集,对不起!
    猜你喜欢
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2023-03-14
    • 2017-09-08
    相关资源
    最近更新 更多