带有条件 aggfunc 的 Pandas 数据透视表

Ankit Goel

我的熊猫数据框如下:

df = pd.DataFrame({"PAR NAME":['abc','def','def','def','abc'], "value":[1,2,3,4,5],"DESTCD":['E','N','E','E','S']})

我需要为 PAR NAME 旋转 df 并找出其值的百分比来自 DESTCD 为“E”的地方。像这样的东西(显然不起作用!)

df.pivot_table(index="PAR NAME",values=["value"],aggfunc={'value':lambda x: (x.sum() if x["DESTCD"]=="E")*100.0/x.sum()})

我目前正在通过添加一个条件列,然后将它与数据透视中的“值”相加,然后进行除法,但我的数据库很大(1gb+),必须有一种更简单的方法。

编辑:预期输出 abc 16.67(因为 abc 和 E 是总 abc 中的 1,即 6)def 77.78(因为 def 和 E 是总 def 中的 7);

(注意:请不要推荐切片多个数据帧,因为我的数据很大,效率很关键:))

西蒙

我试图在没有特别引用 'E' 的情况下解决这个问题,因此它可以推广到任何字母。输出是一个数据帧,然后您可以在 E 上对其进行索引以获得答案。我只是单独进行了聚合,然后使用了一种高效的连接方法。

df = pd.DataFrame({"PAR NAME":['abc','def','def','def','abc'], "value":[1,2,3,4,5],"DESTCD":['E','N','E','E','S']})

# First groupby 'DESTCD' and 'PAR NAME'
gb = df.groupby(['DESTCD', 'PAR NAME'], as_index=False).sum()
print(gb)
  DESTCD PAR NAME  value
0      E      abc      1
1      E      def      7
2      N      def      2
3      S      abc      5

gb_parname = gb.groupby(['PAR NAME']).sum()
out = gb.join(gb_parname, on='PAR NAME', rsuffix='Total')
print(out)
  DESTCD PAR NAME  value  valueTotal
0      E      abc      1           6
1      E      def      7           9
2      N      def      2           9
3      S      abc      5           6

out.loc[:, 'derived']= out.apply(lambda df: df.value/df.valueTotal, axis=1)

print(out)
  DESTCD PAR NAME  value  valueTotal   derived
0      E      abc      1           6  0.166667
1      E      def      7           9  0.777778
2      N      def      2           9  0.222222
3      S      abc      5           6  0.833333

这也是一个相对高效的操作

%%timeit
gb = df.groupby(['DESTCD', 'PAR NAME'], as_index=False).sum()
gb_parname = gb.groupby(['PAR NAME']).sum()
out = gb.join(gb_parname, on='PAR NAME', rsuffix='Total')
out.loc[:, 'derived']= out.apply(lambda df: df.value/df.valueTotal, axis=1)
100 loops, best of 3: 6.31 ms per loop

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章