【问题标题】:Pandas Groupby then cumulative percentage of the groupsPandas Groupby 然后累积的组百分比
【发布时间】:2022-01-14 11:45:41
【问题描述】:

所以我的数据集看起来像这样,我想先按 TSI 列对我的数据集进行分组,然后为每个分组的 TSI 找到 cum% 的 ONS

F TSI F ONS Cum%ONS
A1020 0.5
A1020 1.3
A1020 2.2
A1020 3.1
B1020 0.5
B1020 1.4
D1020 0.5
D1020 1.4

我如何找到每个组的累积百分比以便我得到

F TSI F ONS Cum%ONS
A1020 0.5 7.142%
A1020 1.3 25.71%
A1020 2.2 57.13%
A1020 3.0 100%
B1020 0.5 26.315%
B1020 1.4 100%
D1020 0.5 26.3%
D1020 1.4 100%
a = df.groupby(['TSI'])['Final ONS'].cumsum()
b = df.groupby(['TSI'])['Final ONS'].sum()
g = df.groupby(['TSI'])['Final 
ONS'].cumsum(axis=0)/df.groupby(['TSI'])['Final ONS'].sum()
g = pd.DataFrame(g)
g

这段代码给了我 nan 值

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    这是一种方法:

    (i) groupby "F_TSI" 并为每个组找到 "F_ONS" 的 cumsum

    (ii) groupby "F_TSI" 并为每个组转换 "F_ONS" 的总和

    (iii) 将 (i) 除以 (ii) 得到百分比

    gb_obj = df.groupby('F_TSI')['F_ONS']
    df['Cum%ONS'] = gb_obj.cumsum() / gb_obj.transform('sum') * 100
    

    输出:

       F_TSI  F_ONS     Cum%ONS
    0  A1020    0.5    7.042254
    1  A1020    1.3   25.352113
    2  A1020    2.2   56.338028
    3  A1020    3.1  100.000000
    4  B1020    0.5   26.315789
    5  B1020    1.4  100.000000
    6  D1020    0.5   26.315789
    7  D1020    1.4  100.000000
    

    【讨论】:

    • 非常感谢您!您能否解释一下我做错了什么以及为什么我得到了 nan 值以及为什么我们应该使用 object.transform('sum')
    • @DhairyaMody transform 返回一个 DataFrame,其索引与填充组和的原始对象相同。换句话说,长度与原始 DataFrame 匹配。这就是为什么你可以按元素划分。使用sum,因为它不是标量 pandas 不会知道哪个数字对应于哪个组。这就是为什么你得到不正确的值。
    猜你喜欢
    • 2018-09-08
    • 2021-05-13
    • 1970-01-01
    • 2022-06-13
    • 2013-06-10
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多