我正在try 计算每个组内的滚动和或任何其他统计数据(例如平均值).下面我给出了一个例子,其中窗口是2,统计量是总和.

df = pd.DataFrame.from_dict({'class': ['a', 'b', 'b', 'c', 'c', 'c', 'b', 'a', 'b'],
                        'val': [1, 2, 3, 4, 5, 6, 7, 8, 9]})
df['sum2_per_class'] = [1, 2, 5, 4, 9, 11, 10, 9, 16] # I want to compute this column
# df['sum2_per_class'] = df[['class', 'val']].groupby('class').rolling(2).sum() # what I tried

    class  val  sum2_per_class
 0     a    1               1
 1     b    2               2
 2     b    3               5
 3     c    4               4
 4     c    5               9
 5     c    6              11
 6     b    7              10
 7     a    8               9
 8     b    9              16

以下是我try 过的内容和相应的错误:

df['sum2_per_class'] = df[['class', 'val']].groupby('class').rolling(2).sum()

TypeError: incompatible index of inserted column with frame index

推荐答案

正如错误消息所传达的那样,滚动和操作返回具有MultiIndex的pandas Series,该Series无法直接分配给收件箱中的单个列.

一个可能的修复方法是使用reset_index()将MultiIndex转换为普通索引,如下所示:

df['sum2_per_class'] = df[['class', 'val']].groupby('class').rolling(2).sum().reset_index(level=0, drop=True)

然而,在运行上述代码后,我在"sum2_per_Class"列中得到了意外的NaN值,如下所示:[NaN, NaN, 5, NaN, 9, 11, 10, 9, 16],而其他值与预期相同.

在调查NaN问题后,我得出了以下结论:

  • 滚动和操作需要每个组中至少有两行CONSECUTIVE行才能计算总和.例如,对于第一组"a",我们有:1)Row 0val1=1Row 7val=8,您预计滚动和为1 + 8 = 9,而这些行不连续,将产生NaN.对于我们获得预期滚动总和的其他组,分组行是连续的.例如,对于组"c",我们有:Row 3Row 4Row 5.

更新: 要解决NaN问题,您可以在Rolling函数中指定min_periods=1,如下所示:

df['sum2_per_class'] = df[['class', 'val']].groupby('class').rolling(2, min_periods=1).sum().reset_index(level=0, drop=True)

Python相关问答推荐

使用LangChain拆分HTML文件并保存块

七段显示不完整

如何分割我的收件箱,以便连续的数字各自位于自己的收件箱中?

Python在通过Inbox调用时给出不同的响应

Django序列化器没有验证或保存数据

具有多个组的条形图的不同y标度

为什么基于条件的过滤会导致pandas中的空数据框架?

将numpy矩阵映射到字符串矩阵

是什么导致对Python脚本的jQuery Ajax调用引发500错误?

opencv Python稳定的图标识别

将HTML输出转换为表格中的问题

计算相同形状的两个张量的SSE损失

未删除映射表的行

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

按顺序合并2个词典列表

管道冻结和管道卸载

组/群集按字符串中的子字符串或子字符串中的字符串轮询数据框

pandas:排序多级列

Maya Python脚本将纹理应用于所有对象,而不是选定对象

寻找Regex模式返回与我当前函数类似的结果