【问题标题】:Pandas groupby multiple columns, but need show unique value in a column after groupbyPandas groupby 多列,但需要在 groupby 之后的列中显示唯一值
【发布时间】:2020-09-12 10:56:32
【问题描述】:

您好,我有一个如下所示的数据框:

    Supplier_number Supplier_name   Supply_cat  USD
0   111               A             Cat_1        1
1   221               B             Cat_1        2
2   222               B             Cat_1        3
3   331               C             Cat_1        4
4   332               C             Cat_2        5
5   441               D             Cat_1        6
6   551               E             Cat_2        7
7   552               E             Cat_1        8

然后我运行下面的行并返回下面的df:

df_2a = df.groupby(['Supplier_number','Supplier_name', 'Supply_cat', ], as_index = False).sum().sort_values('USD')

    Supplier_number Supplier_name   Supply_cat  USD
0   111             A               Cat_1       1
1   221             B               Cat_1       2
2   222             B               Cat_1       3
3   331             C               Cat_1       4
4   332             C               Cat_2       5
5   441             D               Cat_1       6
6   551             E               Cat_2       7
7   552             E               Cat_1       8

但是我想获得的df类似于下面的那个

Supplier_number Supplier_name   Supply_cat     USD
0   111             A               Cat_1       1
**1 221             B               Cat_1       5
2   222**                                       
3   331             C               Cat_1       4
4   332             C               Cat_2       5
5   441             D               Cat_1       6
6   551             E               Cat_2       7
7   552             E               Cat_1       8

逻辑:相同的供应商名称、相同的供应类别、多个供应商编号 - 将供应商名称和供应类别分组,汇总美元,但保持供应商编号不变

首先感谢您的帮助。

【问题讨论】:

    标签: python pandas dataframe pandas-groupby jupyter


    【解决方案1】:

    DataFrame 的大小与原始大小相同。所以我们可以先计算美元,然后将重复的单元格放入NaN。 我们可以试试GroupBy.transform + sum 获取USD 列。然后你可以maskDataFrame.duplicated 重复

    columns_group = ['Supplier_name', 'Supply_cat']
    mask_columns = df.columns.difference(['Supplier_number'])
    df['USD'] = df.groupby(columns_group)['USD'].transform('sum')
    df[mask_columns] = df[mask_columns].mask(df.duplicated(columns_group))
    
    #if you want blanks instead NaN
    #df[mask_columns] = df[mask_columns].mask(df.duplicated(columns_group), '')
    
    
    print(df)
    

    输出

       Supplier_number Supplier_name Supply_cat  USD
    0              111             A      Cat_1  1.0
    1              221             B      Cat_1  5.0
    2              222           NaN        NaN  NaN
    3              331             C      Cat_1  4.0
    4              332             C      Cat_2  5.0
    5              441             D      Cat_1  6.0
    6              551             E      Cat_2  7.0
    7              552             E      Cat_1  8.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-04
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      相关资源
      最近更新 更多