将带有小计的pandas groupby结果转换为相对值

3

我发现了一个很好的解决方案,可以将小计插入到 Pandas groupby 数据框中。但是,现在我想修改结果以显示相对于小计的值,而不是绝对值。

以下是用于显示 groupby 的代码:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        "Category": np.random.choice(["Group A", "Group B"], 50),
        "Product": np.random.choice(["Product 1", "Product 2"], 50),
        "Units_Sold": np.random.randint(1, 100, size=(50)),
        "Date": np.random.choice(
            pd.date_range("1/1/2011", "03/31/2011", freq="D"), 50, replace=False
        ),
    }
)

iList = ["Category", "Product"]

pvt = pd.concat(
    [df.assign(**{x: "" for x in iList[i:]}).groupby(iList).sum() for i in range(1, 3)]
).sort_index()

print(pvt)

导致了
                    Units_Sold
Category Product              
Group A                   1170
         Product 1         434
         Product 2         736
Group B                    980
         Product 1         437
         Product 2         543

我尝试了类似的事情。

pvt.transform(lambda x: (round(x / x['Group A', ''],2)*100).astype(int).astype(str)+"%")

但显然这只计算相对于第一行的值。

我需要的是:

                    Units_Sold
Category Product              
Group A                   100%
         Product 1         37%
         Product 2         63%
Group B                   100%
         Product 1         45%
         Product 2         55%

非常感谢!

1个回答

4

使用 GroupBy.applyMultiIndex 的第一层级使用 lambda 函数:

f = lambda x: (x / x.iloc[0]).mul(100).round(2).astype(int).astype(str)+"%"
df = pvt.groupby(level=0).apply(f)
print (df)
                   Units_Sold
Category Product             
Group A                  100%
         Product 1        49%
         Product 2        50%
Group B                  100%
         Product 1        52%
         Product 2        47%

或者使用GroupBy.transformGroupBy.first

df = (pvt.div(pvt.groupby(level=0).transform('first'))
         .mul(100)
         .round(2)
         .astype(int)
         .astype(str)+"%")
print (df)

                   Units_Sold
Category Product             
Group A                  100%
         Product 1        43%
         Product 2        56%
Group B                  100%
         Product 1        58%
         Product 2        41%

1
非常感谢,解决方案非常好。我甚至比第一个更喜欢第二个! - divingTobi
@divingTobi 如果这个解决方案对您有帮助,请考虑接受它以关闭此问题。谢谢。 - anky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接