pandas GroupBy、协商字符串并返回唯一值

bnl4lu3b  于 2023-01-24  发布在  其他
关注(0)|答案(2)|浏览(135)

如何新增聚合数据列

我想在 Dataframe 中创建03个新列

第01列:唯一列表

cfop_code唯一值的 Dataframe 中为每个key创建新列

第02列:唯一计数

用于检查unique_list中显示的唯一值数量的列

第03列:非唯一计数

用于检查unique_list中显示的非唯一值的数量的列

示例_df

| | 键|积|cfop_代码|
| - ------|- ------|- ------|- ------|
| 无|小行星1234567890|产品a|小行星2551|
| 1个|小行星1234567890|产品b|小行星2551|
| 第二章|小行星1234567890|产品c|小行星3551|
| 三个|小行星1234567890|产品a|小行星2551|
| 四个|小行星1234567890|产品b|小行星2551|
| 五个|小行星1234567890|产品c|小行星2407|

预期结果

| | 键|积|cfop_代码|唯一列表|唯一计数|非唯一计数|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 无|小行星1234567890|产品a|小行星2551|二二五一、三五五一|第二章|三个|
| 1个|小行星1234567890|产品b|小行星2551|二二五一、三五五一|第二章|三个|
| 第二章|小行星1234567890|产品c|小行星3551|二二五一、三五五一|第二章|三个|
| 三个|小行星1234567890|产品a|小行星2551|小行星2251|1个|1个|
| 四个|小行星1234567890|产品b|小行星2551|小行星2407、2551|第二章|第二章|
| 五个|小行星1234567890|产品c|小行星2407|小行星2407、2551|第二章|第二章|

我所尝试的

创建唯一值列表
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
将计数唯一值获取到数据框中
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

但添加新列失败

一个三个三个一个

rnmwe5a2

rnmwe5a21#

试试看:

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()

返回一个DataFrame。您尝试将整个DataFrame分配给一个新列,但失败了。

gmol1639

gmol16392#

您可以在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

相关问题