pandas 对数据框中的唯一值进行计数,然后在分组时将值追加到字符串前面

ehxuflar  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(120)

我有以下数据框:
| 姓名|身份证|型号|
| - ------|- ------|- ------|
| 爱丽丝|爱丽丝_1|(甲_01)、(甲_02)|
| 鲍勃|bob_1|(B_01)|
| 爱丽丝|爱丽丝_2|(第一页)、(第五页)|
| 爱丽丝|alice_3|(第一页)、(第五页)|
| 鲍勃|bob_2|(B_01)|
| 鲍勃|鲍勃3|(B_01)|
我想计算括号内的唯一模型值,并将计数附加到括号前面,如下所示:
| 姓名|型号|
| - ------|- ------|
| 爱丽丝|3次(A_01)、2次(A_05)、1次(A_02)|
| 鲍勃|3个(B_01)|
我尝试使用不同的方法来处理group by和aggregate函数,但没有找到方法。我也可以使用值计数并计算每个Model,但我不知道如何将结果数字附加到整个数据框中。

kse8i1jr

kse8i1jr1#

使用Series.str.splitDataFrame.explode,通过,连接值获得新行,然后通过GroupBy.size获得计数,排序并添加到Model列,最后聚合join

df = (df.assign(Model = df['Model'].str.split(', '))
          .explode('Model')
          .groupby(['Name','Model'])
          .size()
          .sort_values(ascending=False)
          .astype(str)
          .add('x')
          .reset_index(level=1)
          .assign(Model = lambda x: x[0].str.cat(x['Model']))
          .groupby('Name')['Model']
          .agg(', '.join)
          .reset_index())
print (df)
     Name                         Model
0  Alice   3x(A_01), 2x(A_05), 1x(A_02)
1    Bob                       3x(B_01)
gg58donl

gg58donl2#

split + explode之后,在groupby.aggcollections.Counter的帮助下使用自定义聚合:

from collections import Counter

out = (df
   .assign(Model=df['Model'].str.split(',\s*'))
   .explode('Model')
   .groupby('Name', as_index=False)['Model']
   .agg(lambda g: ', '.join([f'{i}x {x}' for x, i in Counter(g).items()]))
)

输出:

Name                            Model
0  Alice  3x (A_01), 1x (A_02), 2x (A_05)
1    Bob                        3x (B_01)

如果希望值按频率排序(而不是所见顺序),请使用Counter(g).most_common()代替Counter(g).items()
输出:

Name                            Model
0  Alice  3x (A_01), 2x (A_05), 1x (A_02)
1    Bob                        3x (B_01)

相关问题