【问题标题】:Adding Calculation to a lambda or function向 lambda 或函数添加计算
【发布时间】:2019-09-13 21:28:21
【问题描述】:

我有一个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

我正在使用如下代码:

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

这给了我每种颜色状态的百分比。

还有一个名为 dollar_value 的字段,其中每行包含美元金额,如果我想在 1 的输出中添加两个字段。 Total_Dollars strong> 表示该颜色和状态,2. dollar_per_order 表示该颜色(这意味着如果 Total_Dollars 为 1000,并且该颜色和状态有 200 行,则为 1000 /200 或 5。我可以轻松地将这两个计算添加到我已经拥有的输出中吗?或者我需要创建一个函数吗?

期望的输出:

    Color     Status              Total |Dollar_Per_Order                
    Blue   Cancelled    0.666667  1000       20
           Processed    0.333333  200        5
    Green  Cancelled    0.666667  2000       20
           Processed    0.333333  1000       5
    Red    Processed    1.000000  300        10
    dtype: float64

谢谢!

【问题讨论】:

  • 美元价值从何而来??
  • total_dolar = groupby().sum(), dolar_per_order = groupby().mean()?
  • df 中有另一列,每行只有美元值

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


【解决方案1】:

要计算所有 3 列,请将要应用于每个组的函数定义为:

def fn(grp):
    total = grp.dollar_value.sum()
    rowNo = len(grp.index)
    return pd.Series([ rowNo/cc[grp.name[0]], total, total/rowNo ],
        index=[ 'Percentage', 'Total_Dollars', 'Dollar_per_order'])

然后应用它:

df.groupby(by=['Color', 'Status']).apply(fn)

请注意,我使用了len(grp.index) 而不是len(grp)。 原因是它运行得更快。

我也以其他方式阅读当前组的颜色

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 2018-12-28
    • 2022-01-06
    • 1970-01-01
    • 2021-10-09
    • 2020-04-26
    • 1970-01-01
    • 2020-01-08
    相关资源
    最近更新 更多