Pandas:agg()告诉我“Series”对象是可变的,因此它们不能散列

2024-06-27 09:34:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试agg()一个df,同时从其中一列创建一个子集:

indi = pd.DataFrame({"PONDERA":[1,2,3,4], "ESTADO": [1,1,2,2]})

empleo = indi.agg(ocupados = (indi.PONDERA[indi["ESTADO"]==1], sum) )

但是我得到了'Series' objects are mutable, thus they cannot be hashed

我只想在“ESTADO”==1时对“Poundera”的值求和

预期产出:

  ocupados
0     3

我试图模仿R函数summarise(),所以我想在一个步骤中和agg其他一些列中完成它

在R中类似于:

empleo <- indi %>% 
  summarise(poblacion = sum(PONDERA),
            ocupados = sum(PONDERA[ESTADO == 1]))

这是正确的方法吗

提前谢谢大家


Tags: dataframedfobjectsare子集aggseriespd
3条回答

通常agg作为参数函数,而不是级数本身。但在您的情况下,分离过滤和求和更为有利

其中一个选择是:

empleo = indi.query("ESTADO == 1")[["PONDERA"]].sum()

(使用单方括号输出单个数字,而不是pd.Series

有点奇怪,但输出的格式正是您想要的格式,语法与您尝试的类似:

使用^{}代替^{}

empleo = (indi.loc[indi['ESTADO']==1]
              .groupby('ESTADO')
              .agg(ocupados=('PONDERA', sum))
              .reset_index(drop=True)
         )

结果:

print(empleo)给出了:

   ocupados
0         3

另一个选项是使用loc并在estado=1时过滤数据帧,以及sum列a的值:

indi.loc[indi.ESTADO==1, ['PONDERA']].sum()

感谢@Henry的投入

相关问题 更多 >