【问题标题】:How to groupby and sum if the cell value of certain columns fit specific conditions如果某些列的单元格值符合特定条件,如何分组和求和
【发布时间】:2018-12-14 05:59:18
【问题描述】:

我觉得我正在尝试做的是非常基本的,但我似乎无法在这里找到类似的帖子。如果我的帖子确实是重复的,请告诉我。

我掌握的数据是关于交通事故的。前两列显示事件的确切死亡和受伤人数,但第 3 和第 4 列(酒精和手机相关)仅显示二进制值:0(表示不相关)和 1(表示相关)。

示例数据如下:

(对不起,数据与列标题不完全对齐,我一直不知道如何正确格式化。如果有人可以分享任何提示,将不胜感激。)

    NAME FATAL# INJURY# ALCOHOL CELL
0   City A  5   1   0   0
1   City B  5   1   0   1
2   City A  3   1   1   0
3   City B  3   1   1   0
4   City A  3   0   1   0
5   City B  2   2   0   0

我想要的是对前两列进行分组求和,然后当 ALCOHOLCELLPHONE 列单元格值为 1 时,计算每个城市的 FATAL 总和。

所以基本上我想要的输出是:

   NAME FATAL# INJURY # ALCOHOL FATALCELL FATAL
0   City A  11  2   6   0
1   City B  10  4   3   5

抱歉,格式错误,如果有助于理解,请提供上述数据框的图片:

我有什么

我想要什么

我知道前两列我会写df.groupby(['NAME']).['FATAL', 'INJURIES'].sum()。至于第二部分,我可以做df1.groupby(['NAME','ALCOHOL_RELATED'])['FATAL_COUNT', 'INJURY_COUNT'].sum(),但我会丢失总数列。

我该怎么做呢?

谢谢。

【问题讨论】:

    标签: python pandas dataframe group-by pandas-groupby


    【解决方案1】:

    有时将其他系列加入您的数据框是最清楚的,然后groupby

    df = pd.DataFrame({'NAME': ['CityA', 'CityB', 'CityA', 'CityB', 'CityA', 'CityB'],
                       'FATAL#': [5, 5, 3, 3, 3, 2],
                       'INJURY#': [1, 1, 1, 1, 0, 2],
                       'ALCOHOL': [0, 0, 1, 1, 1, 0],
                       'CELL': [0, 1, 0, 0, 0, 0]})
    
    # construct fatals dataframe and join
    fatals = df.iloc[:, -2:].mul(df['FATAL#'], axis=0).add_prefix('FATAL_')
    df = df.join(fatals)
    
    # define columns to sum and groupby
    sum_cols = ['FATAL#', 'INJURY#'] + df.columns[-2:].tolist()
    res = df.groupby('NAME')[sum_cols].sum().reset_index()
    
    print(res)
    
        NAME  FATAL#  INJURY#  FATAL_ALCOHOL  FATAL_CELL
    0  CityA      11        2              6           0
    1  CityB      10        4              3           5
    

    【讨论】:

    • 哇,惊人的答案。感谢您快速而详细的回复。我什至不知道muladd_prefix 函数。只有一件事我不明白:axis = 0 做什么?文档没有给出任何示例,它显示axis = 'columns',但我没有名称为0 的列。你能详细说明一下吗?再次感谢。
    • mul docs 一定要提到axis,这里axis=0axis='index' 相同,表示逐行相乘。
    • 谢谢。我在玩你的代码时得到了它。但是由于我的知识/想象力的限制,我似乎无法弄清楚axis = 'columns' 将如何工作。当我们将这两个df并排放置时,除了按行之外,我们还能如何将它相乘?
    • @BowenLiu,我不这么认为。这就是我们使用axis='index' 的原因!
    【解决方案2】:

    在单个groupby中:

    df.groupby('NAME').agg(
    lambda grp: [grp.loc[grp[col] > 0, 'FATAL#'].sum() if col != 'INJURY#' else grp[col].sum() 
                 for col in grp if col != 'FATAL#'])
    
    
    >>>df
    
    NAME    FATAL#  INJURY# ALCOHOL CELL
    A   11  2   6   0
    B   10  4   3   5
    

    【讨论】:

      【解决方案3】:

      您可以使用np.where 创建ALCOHOL_FATALCELL_FATAL 列。

      import numpy as np
      
      df['ALCOHOL_FATAL'] = np.where(df['ALCOHOL'] == 1, df['FATAL'], 0)
      df['CELL_FATAL'] = np.where(df['CELL'] == 1, df['FATAL'], 0)
      

      之后,删除 ALCOHOLCELL 列并按数据分组

      df.drop(['ALCOHOL', 'CELL'], axis = 1, inplace=True)
      df.groupby('NAME', as_index=False).sum()
      
          NAME    FATAL # INJURY #    ALCOHOL_FATAL   CELL_FATAL
      0   CityA   11  2   6   0
      1   CityB   10  4   3   5
      

      【讨论】:

        猜你喜欢
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多