Pandas-记录-DataFrame个体到组别维度数据聚合并生成新字段

Pandas-记录-DataFrame个体到组别维度数据聚合并生成新字段,第1张

Pandas-记录-DataFrame个体到组别维度数据聚合并生成新字段 背景

  • 当前有如图三个字段:
    尺码系数”、“颜色汇总尺码系数”、“比例”
  • 现已知这三个字段的数学关系:
    SUM(“尺码系数”) GROUP BY “颜色” = “颜色汇总尺码系数”
    “尺码系数” / “颜色汇总尺码系数” = “比例”

-现Dataframe为商品维度,维度关系为 商品:颜色 = n:1
-已存在“尺码系数”字段,需新增“颜色汇总尺码系数”、“比例”两个字段

实现

假设Dataframe 为 df
已存在字段为[‘商品’,‘颜色’,‘尺码系数’]

df = pd.Dataframe(columns=['商品', '颜色', '尺码系数'], datas=datas]
colour_size_factor_sum = df.groupby('颜色')['尺码系数'].sum()
df_colour_size_factor_sum = pd.Dataframe({"颜色汇总尺码系数": colour_size_factor_sum }).reset_index()
df = pd.merge(df, df_colour_size_factor_sum, how='left', on='颜色')
步骤拆分
  1. 按“颜色”分组对“尺码系数”聚合后得到Series,其中“颜色”为索引列,“尺码系数”(聚合)为数据
    colour_size_factor_sum = df.groupby('颜色')['尺码系数'].sum()
    print(colour_size_factor_sum)
    print(type(colour_size_factor_sum))

打印结果如下

print(colour_size_factor_sum)

print(type(colour_size_factor_sum))

  1. 创建Dataframe读取字典数据,key值命名为“颜色汇总尺码系数”,value对应聚合好的“尺码系数”即colour_size_factor_sum
    df_colour_size_factor_sum = pd.Dataframe({"颜色汇总尺码系数": colour_size_factor_sum}).reset_index()
    print(df_colour_size_factor_sum )

print(df_colour_size_factor_sum )

其中reset_index()的作用为重置索引,可以对比一下不用reset_index()的输出结果

    df_colour_size_factor_sum = pd.Dataframe({"颜色汇总尺码系数": colour_size_factor_sum})
    print(df_colour_size_factor_sum )
    print(df_colour_size_factor_sum['颜色'])

print(df_colour_size_factor_sum )

尝试输出一下print(df_sku_colour_size_factor_sum[‘sku颜色’])

上图看到的"颜色"那一列不是因为错行了,而是它本身就是一个索引列,因此调用“颜色”列的时候报错
即reset_index()在此处重置了数据的索引,而原索引列保留,并且索引列的名称“颜色”并没有被识别为数据,而是作为列名存储了下来

  1. pd.merge 关联匹配数值
df = pd.merge(df, df_colour_size_factor_sum, how='left', on='颜色')

这块就没什么好说的了,就是个LEFT JOIN,只不过pandas的merge需要注意的是:

  • 如果你使用LEFT JOIN的时候,ON的对象在右表不是唯一索引的话,就会出现匹配完后,主表的数据增加的现象(一定要确保ON的字段在非主表为唯一索引)
结束语

工作中偶尔用到了,自己用的一个比较麻烦的方法,姑且能解决问题
目前所学知识没找到更好的方法实现,如果有更好的方法希望大家分享一下~

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4677507.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-06
下一篇 2022-11-07

发表评论

登录后才能评论

评论列表(0条)

保存