1 求助: 用3列组合来分组, 另2列聚合时作不同的计算方法

源表
型号规格版本数量库存均价
AHT215
AHT110
AHK15
AHK310
BHK53
结果:
型号规格版本数量库存均价
AHT213.33
AHK48.75
BHK53
请先 登录 后评论

6 个回答

帅哥淦
樓主,以下為我的代碼,不知道是不是你要的,獻醜了
  1. # 型號,規格,版本
  2. model = ['A', 'B']
  3. specification = ['H']
  4. version = ['T', 'K']

  5. # 創建字典
  6. something = {}
  7. for m in model:
  8.     for s in specification:
  9.         for v in version:
  10.             something[''.join([m, s, v])] = [0, 0]

  11. # 資料輸入
  12. data = [('AHT', 2, 15), ('AHT', 1, 10), ('AHK', 1, 5), ('AHK', 3, 10), ('BHK', 5, 3)]
  13. for d in data:
  14.     something[d[0]][0] += d[1]
  15.     something[d[0]][1] += (d[1]*d[2])
  16. key = something.keys()
  17. for k in key:
  18.     try:
  19.         something[k][1] = something[k][1]/something[k][0]
  20.     except:
  21.         pass

  22. # 輸出結果 = {'型號 規格 版本': [數量, 庫存均價]}
  23. print(something) # 列印出:{'AHT': [3, 13.333333333333334], 'AHK': [4, 8.75], 'BHT': [0, 0], 'BHK': [5, 3.0]}
复制代码
请先 登录 后评论
毒药小哥
#谢谢老师的回复, 我想要的结果, 是直接的表格, 可以直接写到excel的结果,  并且型号, 规格, 版本,  不能合并在一个单元格, 要分列显示, 我是需要写到#excel中去的,  最终得到就是结果的表格形式,  我想得到的不但是结果,  还包含了表格的形式.  我下面的代码, 正好达到了我所要求的,  正确结果和表格#形式,   但是我感觉,  虽然结果正确, 但是我写的代码可能不太科学,   再次请问下老师第1点:    优化的代码应该怎么写 ..  第2点,  得到的结果打印出来, 第2行前面2列未显示,  如何让它正常显示


df=pd.DataFrame({'型号':['A','A','A','A','B',],
                    '规格':['H','H','H','H','H'],
                     '版本':['T','T','K','K','K'],
                     '数量':[2,1,1,3,5],
                      '均价':[15,10,5,10,3]})
print(df)
#求加权平均数的函数
def jj(x):  
    x['均价']=np.average(x['均价'],weights=x['数量'])
    return x
df1=df.groupby(['型号','规格','版本']).apply(jj)  #不合并行,按分组计算加权平均价写到每行
df1=df1.groupby(['型号','规格','版本','均价']).agg({'数量':np.sum})
#df1=df1.groupby(['型号','规格','版本']).agg({'数量':np.sum,'均价':'jj'})  #想用此句代替上面2句,但出错
print(df1)

型号 规格 版本  数量  均价
0  A  H  T   2  15
1  A  H  T   1  10
2  A  H  K   1   5
3  A  H  K   3  10
4  B  H  K   5   3
                    数量
型号 规格 版本 均价           
A  H  K  8.750000    4
      T  13.333333   3
B  H  K  3.000000    5
请先 登录 后评论
Bertha02
谢谢老师的回复, 结果是正确的,  就是显示的格式希望所有的信息都在一张表格体现出来, 我下面这段代码得到的结果就是希望的结果,   但是是我拼凑起的,   应该代码可以再优化,  老师能否把我下面代码精简优化下,  

df=pd.DataFrame({'型号':['A','A','A','A','B',],
                    '规格':['H','H','H','H','H'],
                     '版本':['T','T','K','K','K'],
                     '数量':[2,1,1,3,5],
                      '均价':[15,10,5,10,3]})
def jj(x):  #加权平均
    x['均价']=np.average(x['均价'],weights=x['数量']);return x
df1=df.groupby(['型号','规格','版本']).apply(jj)           #不合并行,按分组计算加权平均价写到每行
df1=df1.groupby(['型号','规格','版本','均价'],as_index=False).agg({'数量':np.sum})
print(df1)  
请先 登录 后评论
韩东阳


我就是想以型号,规格,版本, 三列进行分组, 对剩下的2列做不同的运算, 数量的列求和, 对均价的列求加权平均数,  加权平均数= (数量*均价).sum /数量.sum  想用下面一句代码实现, 但是失败,才刚学习的小白不清楚错在哪里,  就另外拼凑了上面的代码得到了结果, 确实也是想要的结果和表格格式,  请教大师如何精简代码达到同样的结果和表格格式
df1=df.groupby(['型号','规格','版本'],as_index=False).agg({'数量':np.sum,'均价':lambda g:np.average(g['单价'],weights=g['数量'])})
请先 登录 后评论
秋叶


樓主,因為pandas並不是我的強項,所以關於第一點我沒有辦法幫你優化或簡化,不好意思。第二點,關於無法顯示前2行,我用你的代碼沒有問題,可以顯示,有可能個人電腦作業系統不一樣關係吧,你可以試試多加兩行代碼試試:

  1. import pandas as pd
  2. import numpy as np
  3. df = pd.DataFrame({'型号':['A','A','A','A','B',],
  4.                     '规格':['H','H','H','H','H'],
  5.                      '版本':['T','T','K','K','K'],
  6.                      '数量':[2,1,1,3,5],
  7.                       '均价':[15,10,5,10,3]})
  8. def jj(x):  #加权平均
  9.     x['均价']=np.average(x['均价'],weights=x['数量']);return x
  10. df1=df.groupby(['型号','规格','版本']).apply(jj)           #不合并行,按分组计算加权平均价写到每行
  11. df1=df1.groupby(['型号','规格','版本','均价'],as_index=False).agg({'数量':np.sum})

  12. # 因為中文字幕不能和英文字母真正對齊的,增加這兩行代碼便可對齊列表,前面兩行應該可以顯示
  13. pd.set_option('display.unicode.ambiguous_as_wide', True)
  14. pd.set_option('display.unicode.east_asian_width', True)

  15. print(df1)
复制代码

增加2行代碼
前:
  1.   型号 规格 版本         均价  数量
  2. 0  A  H  K   8.750000   4
  3. 1  A  H  T  13.333333   3
  4. 2  B  H  K   3.000000   5
复制代码

後:
  1.   型号 规格 版本       均价  数量
  2. 0    A    H    K   8.750000     4
  3. 1    A    H    T  13.333333     3
  4. 2    B    H    K   3.000000     5
复制代码

如果再不能,試試多加:
  1. pd.set_option('display.max_columns', 1000)
  2. pd.set_option('display.width', 1000)
  3. pd.set_option('display.max_colwidth', 1000)
复制代码
请先 登录 后评论
泡泡鱼
谢谢老师的回复和指点 , 辛苦了,  感谢!      
请先 登录 后评论
  • 6 关注
  • 0 收藏,386 浏览
  • 乡下女孑 提出于 2021-09-23 22:14

相似问题