【问题标题】:Perform groupby calculation on column excluding certain conditions对不包括某些条件的列执行 groupby 计算
【发布时间】:2020-10-01 09:23:10
【问题描述】:
I have this df:

data = {'A':[102, 102, 102, 102, 312, 312, 312], 
        'B':[1001,1001,1001,1001,1001,1001,1001],
        'C':[3005,3005,3005,3005,3005,3005,3005],
        'D':[2004,2004,2004,2004,2002,2002,2002],
        'E':[1,3,5,999,1,5,999],
        'F':[300,1,192,837,19,1,1037]} 

df = pd.DataFrame (data, columns = ['A','B','C','D','E','F'])

df.head(7)

一行代码计算百分比,除了我希望它排除 E 列中的行值为 (999) 的计数值:

df['Percentage'] = 100 * df['F'] / df.groupby('A')['F'].transform('sum')

百分比应该显示:

Percentage
60.85193
0.20284
38.94523
(Blank)
95
5
(Blank)

任何帮助将不胜感激

【问题讨论】:

  • df 和 data 是两个独立的数据帧吗?
  • 嗨!您的代码和数据数据框之间有不同的列名称
  • 已编辑,现在一切都正确。对此表示歉意。

标签: python pandas dataframe pandas-groupby percentage


【解决方案1】:

您可以细分您的框架和transform 该特定部分,然后重新分配结果:

# Get the sub group
>>> grp = df[df['E'].ne(999)]

# Not required: this shows the Intermediate state of the transformed percentage
>>> grp['F'].mul(100).div(grp.groupby('A')['F'].transform('sum'))
0    60.851927
1     0.202840
2    38.945233
4    95.000000
5     5.000000
Name: F, dtype: float64

# Apply the result to your main frame
>>> df['Percentage'] = grp['F'].mul(100).div(grp.groupby('A')['F'].transform('sum'))

结果:

>>> df
     A     B     C     D    E     F  Percentage
0  102  1001  3005  2004    1   300   60.851927
1  102  1001  3005  2004    3     1    0.202840
2  102  1001  3005  2004    5   192   38.945233
3  102  1001  3005  2004  999   837         NaN
4  312  1001  3005  2002    1    19   95.000000
5  312  1001  3005  2002    5     1    5.000000
6  312  1001  3005  2002  999  1037         NaN

【讨论】:

    【解决方案2】:

    使用掩码忽略你想要的行。

    import pandas as pd
    
    data = {'A': [102, 102, 102, 102, 312, 312, 312],
            'B': [1001, 1001, 1001, 1001, 1001, 1001, 1001],
            'C': [3005, 3005, 3005, 3005, 3005, 3005, 3005],
            'D': [2004, 2004, 2004, 2004, 2002, 2002, 2002],
            'E': [1, 3, 5, 999, 1, 5, 999],
            'F': [300, 1, 192, 837, 19, 1, 1037]}
    
    df = pd.DataFrame(data, columns=['A', 'B', 'C', 'D', 'E', 'F'])
    
    mask = ~(df['E'] == 999)
    df['Percentage'] = 100 * df[mask]['F'] / df[mask].groupby('A')['F'].transform('sum')
    

    输出:

         A     B     C     D    E     F  Percentage
    0  102  1001  3005  2004    1   300   60.851927
    1  102  1001  3005  2004    3     1    0.202840
    2  102  1001  3005  2004    5   192   38.945233
    3  102  1001  3005  2004  999   837         NaN
    4  312  1001  3005  2002    1    19   95.000000
    5  312  1001  3005  2002    5     1    5.000000
    6  312  1001  3005  2002  999  1037         NaN
    

    【讨论】:

    • 将数据更改为 df (这是我在问题中的一个错误)这似乎只是删除了 E == 999 的百分比值,但它不会改变其他 3 行的百分比值问题说他们应该是什么。
    猜你喜欢
    • 1970-01-01
    • 2015-12-21
    • 2022-07-15
    • 2019-08-28
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多