代码之家  ›  专栏  ›  技术社区  ›  Andre Nevares sj95126

如何在Pandas中为特定键的唯一值添加新列(问题agregate)

  •  0
  • Andre Nevares sj95126  · 技术社区  · 3 年前

    如何添加聚合数据的新列

    我想在数据框中创建03个新列

    第01列:唯一\u列表

    在dataframe中创建唯一值的新列 cfop_code 对于每个 key

    第02列:唯一\u计数

    检查unique\u列表中显示的唯一值数量的列

    第03列:not\u unique\u计数

    检查unique\u列表中显示的非唯一值数量的列

    示例\u df

    钥匙 产品 cfop\U代码
    0 12345678901234567890 产品a 2551
    1. 12345678901234567890 产品b 2551
    2. 12345678901234567890 产品c 3551
    3. 12345678901234567895 产品a 2551
    4. 12345678901234567897 产品b 2551
    5. 12345678901234567897 产品c 2407

    预期结果

    钥匙 产品 cfop\U代码 唯一\u列表 唯一\u计数 not\u unique\u计数
    0 12345678901234567890 产品a 2551 2251, 3551 2. 3.
    1. 12345678901234567890 产品b 2551 2251, 3551 2. 3.
    2. 12345678901234567890 产品c 3551 2251, 3551 2. 3.
    3. 12345678901234567895 产品a 2551 2251 1. 1.
    4. 12345678901234567897 产品b 2551 2407, 2551 2. 2.
    5. 12345678901234567897 产品c 2407 2407, 2551 2. 2.

    我试过的

    创建唯一值列表

    df.groupby('key')["cfop"].unique()
    
    key
    12345678901234567890    [2551, 3551]
    12345678901234567895          [2551]
    12345678901234567897    [2551, 2407]
    Name: cfop, dtype: object
    

    获取计数非唯一值

    df.groupby("key").agg(**{"unique_values": pd.NamedAgg(column='cfop', aggfunc="size")}).reset_index()
    
    key unique_values
    0   12345678901234567890    3
    1   12345678901234567895    1
    2   12345678901234567897    2
    

    将count唯一值获取到数据帧中

    df.groupby("key").agg(**{"unique_values": pd.NamedAgg(column='cfop', aggfunc="nunique")}).reset_index()
    
    key unique_values
    0   12345678901234567890    2
    1   12345678901234567895    1
    2   12345678901234567897    2
    

    但添加新列失败

    df['unique_list'] = df.groupby('key')["cfop"].unique()
    
    df['unique_count'] = df.groupby("key").agg(**{"unique_values": pd.NamedAgg(column='cfop', aggfunc="nunique")}).reset_index()
    df['not_unique_count'] =df.groupby("key").agg(**{"unique_values": pd.NamedAgg(column='cfop', aggfunc="size")}).reset_index()
    
    2 回复  |  直到 3 年前
        1
  •  1
  •   Rabinzel    3 年前

    尝试:

    tmp = (
        df.groupby("key")["cfop_code"]
        .agg(
            unique_list = lambda s: sorted(s.unique()), 
            unique_count = "nunique", 
            not_unique_count = "size")
        .reset_index()
    )
    res = df.merge(tmp, on="key")
    
    print(res)
                        key    product  cfop_code   unique_list  unique_count  not_unique_count
    0  12345678901234567890  product a       2551  [2551, 3551]             2                 3
    1  12345678901234567890  product b       2551  [2551, 3551]             2                 3
    2  12345678901234567890  product c       3551  [2551, 3551]             2                 3
    3  12345678901234567895  product a       2551        [2551]             1                 1
    4  12345678901234567897  product b       2551  [2407, 2551]             2                 2
    5  12345678901234567897  product c       2407  [2407, 2551]             2                 2
    
    

    您尝试的问题是:

    df.groupby("key").agg(**{"unique_values": pd.NamedAgg(column='cfop_code', aggfunc="nunique")}).reset_index()
    

    返回数据帧。您试图将整个数据帧分配给一个新列,但失败了。

        2
  •  1
  •   SomeDude    3 年前

    您可以在group和agg之后进行合并,如:

    df.merge(df.groupby('key',as_index=False).agg(
       unique_list = ('cfop_code', 'unique'),
       unique_count = ('cfop_code', 'nunique'),
       not_unique_count = ('cfop_code', 'size')
    ), on='key', how = 'left')
    

    输出:

                        key    product  cfop_code   unique_list  unique_count  \
    0  12345678901234567890  product a       2551  [2551, 3551]             2   
    1  12345678901234567890  product b       2551  [2551, 3551]             2   
    2  12345678901234567890  product c       3551  [2551, 3551]             2   
    3  12345678901234567895  product a       2551        [2551]             1   
    4  12345678901234567897  product b       2551  [2551, 2407]             2   
    5  12345678901234567897  product c       2407  [2551, 2407]             2   
    
       not_unique_count  
    0                 3  
    1                 3  
    2                 3  
    3                 1  
    4                 2  
    5                 2